事務的隔離級別和傳播行為
一、事務的隔離級別
1.五種事務的隔離級別
①讀_未提交(read_uncommitted): 會出現臟讀、不可重復讀、幻讀。(隔離級別最低,並發性能高)
②讀_已提交(read_committed):會出現不可重復讀、幻讀。(鎖定正在讀取的行)
③重復讀(repeatable_read):會出現幻讀。(鎖定所讀取的所有行)
④序列化(serializable):保證所有的情況不會發生;(鎖表)
⑤默認的隔離級別:
大多數的默認隔離級別是:讀已提交(read_commited)如:Sql Server Oracle.
少數的數據庫的默認隔離級別為:可重復讀(Repeatable Read)如:MySQL InnoDB存儲引擎;
註意:即使是最低的隔離級別,也不會出現第一類丟失更新的問題;
2.不同的事務隔離級別帶來的問題的詳解
①臟讀(事務沒有提交,提前讀取),像是對表進行了更改操作,但是還沒commit;其他事務就來讀取使用了所修改的對象了;
②不可重復讀(兩次讀的不一致),是指當一個事務在兩次讀一個數據的中間,讀完第一次後其他的事務對該數據進行了修改,造成第一個事務兩次讀取的結果不一樣;
③幻讀(是在一個事務對整個表進行修改的時候,另一個事務對該表進行了修改,第一個事務再次讀該表的時候的發現竟然還有沒有被修改的數據)主要是有事務進行了突然的新增或者刪除,造成兩次讀出來的數據的記錄數不一樣了;
註意:不可重復讀和幻讀的區別是,不可重復讀指的是有其他事務對數據進行了修改,造成兩次讀的值不一樣;而幻讀指的是其他事務對所讀的數據的個數進行了修改也就是發生的插入和刪除,這樣在數據記錄的個數上發生了改變;
二、事務的傳播行為
1.Spring中定義的7種事務傳播行為
①PROPAGATION_REQUIRED
如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中;
②PROPAGATION_SUPPORTS
支持當前事務,如果當前沒有事務,就以非事務方式執行;
③PROPAGATION_MANDATORY
使用當前的事務,如果當前沒有事務,就拋出異常;
④PROPAGATION_REQUIRES_NEW
新建事務,如果當前存在事務,把當前事務掛起;
⑤PROPAGATION_NOT_SUPPORTED
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起;
⑥PROPAGATION_NEVER
以非事務方式執行,如果當前存在事務,則拋出異常;
⑦PEOPAGATION_NESTED
如果當前存在事務,則在潛逃事務內執行。如果當前沒有事務,則執行PROPAGATION_REQUIRED列斯的操作;
事務的隔離級別和傳播行為