事務的隔離級別

2022-08-23 00:36:12 字數 1167 閱讀 6825

事務中的修改,即使沒有提交,其他事務也可以看得到,這種現象就叫做髒讀,

例如:​ a賬戶2000元,b賬戶0元,c賬戶0元

​ a給b轉賬 2000元

​ 1、開啟事務

​ 2、檢視 a 有沒有 2000 元

​ 3、有——a 減 2000元;無——回滾

​ 4、b 加 2000元(停在這一步了)

​ 5、提交事務

​ 這是乙個正常的事務

​ 假如這個事務還沒有提交,但是已經走到第三步了,這個時候又來了乙個事務:b 給 c 轉賬 2000 元

​ b給c轉賬 2000元

​ 1、開啟事務

​ 2、檢視 b 有沒有 2000 元 (可以查詢到其他事務未提交的資料)

​ 3、有——b 減 2000元;無——回滾

​ 4、b 加 2000元

​ 5、提交事務

總結:這就是事務還沒提交,而別的事務可以看到他其中修改的資料的後果,也就是髒讀。

大多數資料庫系統的預設隔離級別是read committed(讀已提交),這種隔離級別就是乙個事務的開始,只能看到已經完成的事務的結果,正在執行的,是無法被其他事務看到的。這種級別會出現讀取舊資料的現象

重複讀就是在事務內重複讀取了別的執行緒已經提交的資料,但兩次讀取的結果不一致,原因是查詢的過程中其他事物做了更新的操作。幻讀是指在乙個事務內兩次查詢中資料條數不一致,原因是查詢的過程中,其他的事務做了新增操作。

總結:就是當乙個事務執行到一半,而另乙個事務看不到他執行的操作,所以看到的是舊資料,也就是無效的資料。

repeatable read是mysql預設的事務隔離級別,它可以避免髒讀,不可重複讀的問題,確保同一事物的多個例項在併發讀取資料時,會看到同樣的資料行,但理論上,該級別會出現幻讀的情況,不過mysql的儲存引擎通過多版本併發控制機制,解決了該問題,因此該級別是可以避免幻讀的。

總結:雖然讀取同一條資料可以保證一致性,也是可以避免幻讀的。

serializable是最高的隔離級別,它通過強制事務序列執行(注意是序列),避免了前面的幻讀情況,由於他大量加上鎖,導致大量的請求超時和鎖競爭,因此效能會比較底下,再特別需要資料一致性且併發量不需要那麼大的時候才可能考慮這個隔離級別。

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

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

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

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

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

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