Transactional事務巢狀,失敗情況分析

2021-09-28 16:57:07 字數 1369 閱讀 7125

使用宣告式註解事務,spring掃瞄到帶有@transactional的方法,對其進行**增強(aop切面,呼叫方法前begin,方法結束後commit),當呼叫了乙個未被增強的方法a(無事務註解),內部又呼叫了乙個有事務註解的方法b,由於a是被**的b並未被**,所以b沒有被增強(即使有事務),相反,如果**了有事務註解的方法,那麼內部無論是否有註解都會被事務包含在內。

個人理解,有不對的地方請幫忙矯正.

//偽**

transactional.begin

a(有事務,被增強) 內部呼叫-

>

b(無論有沒有事務,在不在同乙個類,都會被增強)

transactional.commit

a(無事務) 內部呼叫-

>

b(同類b不增強(未被**)

,不同類b會被增強(被**)

,a不會)

同乙個類a呼叫b在都有事務的情況下,b出錯,ab全部回滾,事務成功同乙個類,去掉外層a的事務,b依然有事務,b事務未生效,name成功被修改為22222。

相反去掉內層b的事務開啟外層a的事務,事務成功

結合第一第二種情況來講,只要最外層有事務,內部不需要加不加事務都會被外層影響,內部如果出錯整體都會回滾

這種情況下,在test2事務順利的情況下,b拋異常,無外層事務,name被修改為22222。

如果test2丟擲了異常,在外層無事務的情況下,name被修改為了11111,b並未被呼叫。

外層有事務,test2中無事務且拋異常,b未被執行,事務成功,完成回滾

總結一下就是,

1.當在同乙個類中外層有事務的情況下,內層無論是否加事務,事務都會成功

2.當在同乙個類中外層無事務的情況下,內層無論是否有事務,事務都會失敗

3.當在不同類中外層有事務的情況下,內層無論是否有事務,事務都會成功

4.當在不同類中外層無事務的情況下,內層有事務,內層回滾,外層事務失敗

Transactional事務原理

這個是spring的宣告式事務管理,基於aop程式設計,是一種動態 模式。疑問 1.這個註解是怎麼生效的?配置了transactional註解後,spring容器初始化bean的時候,給他生成 類,執行的時候控制事務的提交。2.多個資料庫的事務怎麼辦?你需要在註解的地方指明資料來源 transact...

Transactional事務幾點注意

這裡面有幾點需要大家留意 a.乙個功能是否要事務,必須納入設計 編碼考慮。不能僅僅完成了基本功能就ok。b.如果加了事務,必須做好開發環境測試 測試環境也盡量觸發異常 測試回滾 確保事務生效。c.以下列了事務使用過程的注意事項,請大家留意。1.不要在介面上宣告 transactional 而要在具體...

Transactional事務幾點注意

這裡面有幾點需要大家留意 a.乙個功能是否要事務,必須納入設計 編碼考慮。不能僅僅完成了基本功能就ok。b.如果加了事務,必須做好開發環境測試 測試環境也盡量觸發異常 測試回滾 確保事務生效。c.以下列了事務使用過程的注意事項,請大家留意。1.不要在介面上宣告 transactional 而要在具體...