事務隔離級別由低往高可分為以下幾類:
read uncommitted
讀取未提交的資料。這是最不安全的一種級別,查詢語句在無鎖的情況下執行,並能讀取到別的未提交的資料,造成髒讀,如果未提交的那個
事務資料全部回滾了,而之前讀取了這個事務的資料即是髒資料,這種資料不一致性讀造成的危害是可想而知的。
read committed
讀取已提交的資料。乙個事務只能讀取資料庫中已經提交過的資料,解決了髒讀問題,但不能重複讀,即乙個事務內的兩次查詢返回的資料是
不一樣的。如第一次查詢金額是100,第二次去查詢可能就是50了,這就是不可重複讀取。
repeatable read
可重複讀取資料,這也是mysql預設的隔離級別。乙個事務內的兩次無鎖查詢返回的資料都是一樣的,但別的事務的新增資料也能讀取到。比
如另乙個事務插入了一條資料並提交,這個事務第二次去讀取的時候發現多了一條之前查詢資料列表裡面不存在的資料,這時候就是傳說的中
幻讀了。這個級別避免了不可重複讀取,但不能避免幻讀的問題。
serializable
可序列化讀。這是效率最低最耗費資源的乙個事務級別,和可重複讀類似,但在自動提交模式關閉情況下可序列化讀會給每個查詢加上共享鎖
和排他鎖,意味著所有的讀操作之間不阻塞,但讀操作會阻塞別的事務的寫操作,寫操作也阻塞讀操作。
上面介紹了4種事務隔離級別及髒讀、不可重複讀、幻讀與它們的聯絡,對應的關係表如下:
mysql官方對於事務級別的定義可參考:
上面介紹的是mysql的事務隔離級別,那跟spring中的事務隔離級別有什麼必然的聯絡呢?
spring就是對資料庫事務進行了封裝而已,並提了5種事務隔離級別和7種事務傳播機制。
5種事務隔離級別
isolation_default
spring將使用資料庫中預設的事務隔離級別。
下面四種定義和上面一致。
isolation_read_uncommitted
isolation_read_committed
isolation_repeatable_read
isolation_serializable
7種事務傳播機制
required
如果當前方法有事務則加入事務,沒有則建立乙個事務。
not_supported
不支援事務,如果當前有事務則掛起事務執行。
requireds_new
新建乙個事務並在這個事務中執行,如果當前存在事務就把當前事務掛起。新建的事務的提交與回滾一掛起事務沒有聯絡,不會影響掛起事務
的操作。
mandatory
強制當前方法使用事務執行,如果當前沒有事務則丟擲異常。
never
當前方法不能存在事務,即非事務狀態執行,如果存在事務則丟擲異常。
supports
支援當前事務,如果當前沒事務也支援非事務狀態執行。
nested
如果當前存在事務,則在巢狀事務內執行。巢狀事務的提交與回滾與父事務沒有任務關係,反之,當父事務提交巢狀事務也一起提交,父事務
回滾會也回滾巢狀事務的。
如果當前沒有事務,則新建乙個事務執行,這時候則與propagation_required場景一致。 事務隔離級別和傳播機制
事務隔離級別由低往高可分為以下幾類 上面介紹了4種事務隔離級別及髒讀 不可重複讀 幻讀與它們的聯絡,對應的關係表如下 7種事務傳播機制 required 如果當前方法有事務則加入事務,沒有則建立乙個事務。not supported 不支援事務,如果當前有事務則掛起事務執行。requireds new...
Spring事務傳播機制和隔離級別
事務的傳播機制是指新增事務時的策略。傳播機制共有以下幾種 propagation mandatory 當前事務必須在乙個已有事務環境中執行,否則丟擲異常 propagation required propagation requires new propagation nested 這三種傳播機制不...
事務的隔離機制和傳播級別
隔離級別 1 isolocation default 資料庫預設級別 2 isolocation read uncommitted 允許讀取未提交的讀,可能導致髒讀,不可重複讀,幻讀 3 isolocation read committed 允許讀取已提交的讀,可能導致不可重複讀,幻讀 4 isol...