資料庫的隔離級別

2022-05-15 19:25:29 字數 1847 閱讀 1202

事務併發執行的問題介紹

●對於同時執行的多個事務,當這些事務訪問資料庫中相同的資料時,如果沒有採取必要的隔離機制,就會導致各種併發問題:

髒讀:對於兩個事務t1,t2,t1讀取了已經被t2更新但還沒有被提交的字段.之後,若t2回滾,t1讀取的內容就是臨時且無效的.

不可重複讀:對於兩個事務t1, t2, t1讀取了乙個字段,然後t2更新了該字段之後,t1再次讀取同乙個字段,值就不同了,

幻讀:對於兩個事務t1,t2,t1從乙個表中讀取了乙個字段,然後t2在該表中插入了一些新的行.之後,如果t1再次讀取同乙個表,就會多出幾行

資料庫事務的隔離性:資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響,避免各種併發問題.

●乙個事務與其他事務隔離的程度稱為隔離級別,資料庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,資料一致性就越好,但併發性越弱.

利用事務隔離級別解決上述三種問題

➢資料庫提供的4種事務隔離級別:

read uncommitted(讀未提交資料)允許事務讀取未被其他事物提交的變更髒讀,不可重複讀和幻讀的問題都會出現

read commited(讀已提交資料)只允許事務讀取已經被其它事務提交的變更,可以避免髒讀. 但不可重複讀和幻讀問題仍然可能出現

repeatable read(可重複讀)確保事務可以多次從乙個欄位中讀取相同的值.在這個事務持續期問,禁止其他事物對這個字段進行更新.可以避免髒讀和不可重複讀,但幻讀的問題仍然存在.

serializable(串 行化)確保事務可以從乙個表中讀取相同的行在這個事務持續期間,禁止其他事務對該錶執行插入,更新和刪除操作.所有併發問題都可以避免,但效能十分低下.

➢oracle支援的2種事務隔離級別: read commited,serializable。oracle預設的事務隔離級別為:read commited

➢mysql支援4種事務隔離級別.mysql預設的事務隔離級別為: repeatable read

一些相關的sql命令

➢檢視隔離級別

select

@@tx_isolation;      # @@transaction_isolation 為在mysql 5

.7的別名

select

@@transaction_isolation; # mysql 8.0的話,第乙個被棄用了,需要用第二個

➢設定隔離級別

set session transaction

isolation

level

隔離級別; #設定當前的事務的隔離級別

set global transaction

isolation

level

隔離級別; #設定全域性的事務的隔離級別

#session和global 可以不寫,預設為session

資料庫隔離級別

read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀 不可重複讀 幻讀read uncommitted re...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...