事務的隔離級別

2021-08-21 15:58:41 字數 2127 閱讀 4574

隔離級別的選擇往往是具有挑戰性的,因為隔離級別太低了吧,會出現一些無法輕易察覺的bug,但若是隔離級別制定的太高,卻會損失並行度、增加死鎖發生的可能性。

資料庫管理系統(dbms)採用「鎖機制」來實現事務的隔離性(isolation,其餘的a、c、d用日誌機制來實現)。當多個事務同時更新資料庫中相同的資料時,只允許持有鎖的事務能更新該資料,其他事務必須等待,直到前乙個事務釋放了鎖,其他事務才有機會更新該資料(併發更新:排它鎖)。

資料庫系統有4個隔離級別,從低到高分別是:未提交讀、已提交讀、可重複讀、序列化。

1、未提交讀read uncommited,問題:髒讀。

不新增共享鎖。分為2種情況:

①情況1:事務b可以在事務a對記錄的讀取過程中修改同一記錄,可能會導致事務a讀取的資料是乙個被破壞的或者是不完整不正確的資料。

②情況2:在事務a中可以讀取到事務b中修改過的資料,但此時事務b尚未提交。可能會發生的問題就是髒讀。

2、已提交讀read commited,問題:不可重複讀。

在事務a中讀取資料時對記錄新增共享鎖,待讀取結束後才會立即釋放該鎖。那麼事務b對該資料的修改要一直等待,直到a中的讀取過程結束,但不是整個事務a的結束。所以,可能發生的問題就是事務a在不同階段對同一記錄的讀取結果可能是不同的。

3、可重複讀repeatable read,問題:幻讀。

對於讀出的記錄,新增共享鎖直到事務a結束。事務b試圖對這個記錄的修改會一直等待,直到整個事務a結束。innodb預設的事務隔離級別就是可重複讀可能發生的問題:當執行乙個範圍查詢時,可能會發生幻讀(解決幻讀的方法:增加範圍鎖ranges,鎖定檢索範圍為唯讀,這樣就避免了幻讀)。

4、序列化serializable,問題:沒有問題,上述3種級別中的髒讀、不可重複讀、幻讀都不會發生。

新增範圍鎖(比如表鎖,頁鎖等),直到事務a結束。以此阻止事務b對此範圍內的修改操作。

5、用乙個生動的例子來解釋。

6、什麼是快照讀、當前讀?(隔離級別rr情況下)

假設兩個使用者同時**,而且同時中獎。兩者都進入了中獎的事務。a事務扣減了獎品數量,b也執行了扣減數量。假設獎品數量是n,如果是可重複讀,那麼,如果兩個事務並行進行,那麼不論a有沒有提交,b讀到的數量都是n,執行後為n-1,而事務a執行後也是n-1,這樣不就有問題了嗎?我們期望的是n-2。這就要用快照讀、當前讀的知識點來解釋了

假設事務a已經提交,由於是可重複讀,那事務b讀到的獎品數量一直是n,執行-1,資料變成n-1,而不是我們期望的n-2。

如果理解了快照讀和當前讀的概念,上面的困惑就不會存在了。

在事務中,執行普通select查詢(強調:一定要是普通select!)之後,會建立快照,後面再執行相同的select語句時,查詢的其實是前面生成的快照。這也就是為什麼能實現可重複讀的原因。而如果執行

select * from table where ? lock in share mode;

select * from table where ? for update;

insert into table values (…); 

update table set ? where ?; 

delete from table where ?;

會執行當前讀,獲取最新資料。回到前面的問題,如果事務b執行n-1操作(這就不是普通的select查詢了),會觸發當前讀,讀取事務a提交後的資料,也就是n-1,在此基礎上執行-1操作,最終n變成n-2。

7、併發更新

上面解決了事務a已經提交的情況。但如果事務a更新獎品數量後但未提交呢?此時事務b執行當前讀拿到的也是n啊。了解資料庫鎖機制的話,就不會有這種困惑了。事務a提交前,會一直持有排他鎖(具體是行鎖還是表鎖,要看查詢條件有沒有走索引),此時事務b更新是會阻塞的。也就是說,只有事務a提交,或回滾之後,事務b才能獲得排它鎖,從而進行更新獎品的操作。

事務的隔離級別舉例 事務的隔離級別

乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...

事務的隔離級別舉例 JDBC 事務隔離級別

本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...

事務的隔離級別舉例 JDBC事務隔離級別

一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。斷開與資料庫的連線 表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗 表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態 事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀...