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。