1. 程式人生 > >Spring的傳播行為與隔離級別,你必須懂的

Spring的傳播行為與隔離級別,你必須懂的

Spring事務中的傳播行為如下:

Require:支援當前事務,如果沒有事務,就建一個新的,這是最常見的;

Supports:支援當前事務,如果當前沒有事務,就以非事務方式執行;

Mandatory:支援當前事務,如果當前沒有事務,就丟擲異常;

RequiresNew:新建事務,如果當前存在事務,把當前事務掛起;

NotSupported:以非事務方式執行操作,如果當前存在事務,就把事務掛起;

Never:以非事務方式執行,如果當前存在事務,則丟擲異常。

Nested:新建事務,如果當前存在事務,把當前事務掛起。與RequireNew的區別是與父事務相關,且有一個savepoint。

其中,Require、Supports、NotSupported、Never兩個看文字也就能瞭解,就不多說了。而Mandatory是要求所有的操作必須在一個事務裡,較Require來說,對事務要求的更加嚴格。

RequireNew:當一個Require方法A呼叫RequireNew方法B時,B方法會新new一個事務,並且這個事務和A事務沒有關係,也就是說B方法出現異常,不會導致A的回滾,同理當B已提交,A再出現異常,B也不會回滾。

Nested:這個和RequireNew的區別是B方法的事務和A方法的事務是相關的。只有在A事務提交的時候,B事務都會提交。也就是說當A發生異常時,A、B事務都回滾,而當B出現異常時,B回滾,而A回滾到savepoint;

Spring事務的隔離級別,事務隔離級別如下:

Serializable:最嚴格的級別,事務序列執行,資源消耗最大;

Repeatable Read:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的資料。

Read Committed:大多數主流資料庫的預設事務等級,保證了一個事務不會讀到另一個並行事務已經修改但未提交的資料。適用於大多數系統

Read Uncommitted:保證了讀取過程中不會讀取到非法資料。

想要理解這四個級別,還需要知道三種不討人喜歡的事情:

dirty reads:髒讀,就是說事務A未提交的資料被事務B讀走,如果事務A失敗回滾,將導致B所讀取的資料是錯誤的。

non-repeatable reads:不可重複讀,就是說事務A中兩處讀取資料,第一次讀時是100,然後事務B把值改成了200,事務A再讀一次,結果就發現值變了,造成A事務資料混亂。

phantom read:幻讀,和不可重複讀相似,也是同一個事務中多次讀不一致的問題。但是不可重複讀的不一致是因為它所要取的資料集被改變了,而幻讀所要讀的資料不一致卻不是他所要讀的資料改變,而是它的條件資料集改變。比如:Select id where name="ppgogo*",第一次讀去了6個符合條件的id,第二次讀時,由於事務B把第一個貼的名字由"dd"改成了“ppgogo9”,結果取出來7個數據。