##spring 默認 非嵌套調用的狀況html
Spring框架的事務基礎架構代碼將默認地 只 在拋出運行時和unchecked exceptions時才標識事務回滾。 也就是說,當拋出一個 RuntimeException 或其子類例的實例時。(Errors 也同樣 - 默認地 - 標識事務回滾。)從事務方法中拋出的Checked exceptions將 不 被標識進行事務回滾。spring
##service 嵌套調用的狀況架構
//service A自己沒有對DAO的處理,可是B和C就有對DAO的處理 service A { service B.someMethod()//調用service B service C.someMmethod()//調用service C }
一、只要拋出的是 checked異常,無論有沒有捕獲,都不會回滾 二、若是C拋出了runtime 異常,A捕獲了,則B不會回滾;若是A沒有捕獲,則回滾。框架
##rollback only的狀況.net
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only。code
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。htm
##docsblog