1. 程式人生 > >查缺補漏之Spring事務

查缺補漏之Spring事務

事務控制不當可能導致的問題:
髒讀:事務A在未提交之前,事務B讀取到資料,隨後事務A回滾,導致事務B中讀取的資料有誤.
不可重複讀:事務A中重複讀取一條記錄,由於兩次讀取間隔中,事務B修改了資料,導致事務A兩次讀取的結果不一致.
幻讀:事務A重複讀取一張表中的資料,由於兩次讀取間隔中,事務B新增或者刪除了資料,導致事務A兩次讀取的結果不一致.

事務隔離級別:
READ_UNCOMMITED:效能最好,但是會導致髒讀,不可重複讀,幻讀.
READ_COMMITED:解決髒讀,但是會導致不可重複讀,幻讀.(鎖住當前行)
REPEATABLE_READ:解決髒讀,不可重複讀,但是會導致幻讀.(鎖住讀取過的行)
SERIALIZABLE:能解決髒讀,不可重複讀,幻讀,但是效能低下.(鎖表)

MySQL預設的事務隔離級別是REPEATABLE_READ.
Oracle、SQLServer預設的事務隔離級別是READ_COMMITED.

事務傳播行為:
Java中的方法總是存在各種呼叫或者被呼叫的關係的,在實際使用中應當根據具體的場景設定不同事務傳播行為.
PROPAGATION_REQUIRED:預設值,如果上下文已經存在事務,則加入事務,否則開啟新的事務.
PROPAGATION_SUPPORTS:如果上下文已經存在事務,則加入事務,否則以非事務的方式執行.
PROPAGATION_MANDOTORY:如果上下文已經存在事務,則加入事務,否則丟擲異常.
PROPAGATION_REQUIRES_NEW:總會開啟新的事務,且將原來上下文事務掛起(如果存在的話).
PROPAGATION_NOT_SUPPORTED:不支援事務,且將原來上下文事務掛起(如果存在的話).
PROPAGATION_NEVER:不支援事務,如果上下文存在事務則丟擲異常.
PROPAGATION_NESTED:如果存在活動事務,則巢狀一個子事務,否則按照預設值PROPAGATION_REQUIRED執行.
需要注意的是巢狀:在開啟子事務前儲存一個回滾點,如果子事務的回滾或者提交不影響父事務,父事務的提交不影響子事務,父事務的回滾同時回滾子事務.
更多的使用場景建議參考:

https://yq.aliyun.com/articles/48893