Spring事務回滾情況

codecraft發表於2016-11-23

spring 預設 非巢狀呼叫的情況

Spring框架的事務基礎架構程式碼將預設地 只 在丟擲執行時和unchecked exceptions時才標識事務回滾。 也就是說,當丟擲一個 RuntimeException 或其子類例的例項時。(Errors 也一樣 – 預設地 – 標識事務回滾。)從事務方法中丟擲的Checked exceptions將 不 被標識進行事務回滾。

service 巢狀呼叫的情況



//service A本身沒有對DAO的處理,但是B和C就有對DAO的處理
service A {

service B.someMethod()//呼叫service B

service C.someMmethod()//呼叫service C

}

1、只要丟擲的是 checked異常,不管有沒有捕獲,都不會回滾
2、如果C丟擲了runtime 異常,A捕獲了,則B不會回滾;如果A沒有捕獲,則回滾。

rollback only的情況

org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only。



begin transaction;

for(……)

{

    doSomething();//丟擲了異常或者明確設定了事務為RollbackOnly

}

commit;

end;



doSomething()虛擬碼:

try

{

          begin transaction;

          /**  do anything  */

          commit;

          end;

}

catch()

{

}

在spring裡面我們配置了事務的傳播機制是REQUIRED,所以這兩個事務最終會合併成一個事務。程式中doSomething()中由於某某原因導致丟擲異常(或者明確將該事務設定為了RollbackOnly),但是由於其內部已經捕獲了這個異常,所以不會影響外面for迴圈的繼續執行,當外面的for迴圈繼續執行完 且準備提交(commit)這個事務時,發現之前這個事務的狀態位已經被設定為了RollbackOnly,此時spring就會丟擲一個ransaction rolled back because it has been marked as rollback-only。

docs

相關文章