[spring,mysql] spring使用注解式事務聲明(@Transactional)無法回滾 .


@Transactional事務回滾

在service類前加上@Transactional,聲明這個service所有方法需要事務管理。每一個業務方法開始時都會打開一個事務。

Spring默認情況下會對運行期例外(RunTimeException)進行事務回滾。這個例外是unchecked

如果遇到checked意外就不回滾。

如何改變默認規則:

1 讓checked例外也回滾:在整個方法前加上 @Transactional(rollbackFor=Exception.class)

2 讓unchecked例外不回滾: @Transactional(notRollbackFor=RunTimeException.class)

3 不需要事務管理的(只查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)


注意: 如果異常在service層被try{}catch{}了,事務就不回滾了,如果想讓事務回滾必須再往外拋try{}catch{throw Exception}。
 

 針對Spring默認情況下RunTimeException @Transactional事務沒有回滾,測試數據錄入數據庫中問題可按以下步驟進行檢查:

1、檢查下Spring配置沒問題,代碼也沒問題;

2、檢查Log4J日志輸出,確實有進行事務回滾動作;

3、檢查下MySQL后台日志輸入,確實有進行“rollback”操作;

在網上搜了些資料,原來執行事務回滾的表默認<表類型="MyISAM">有問題,MyISAM不支持事務!使用如下語句更改表類型為”InnoDB“:

alter table equ_upkeep_plan ENGINE=INNODB,也可以到mysql客戶端修改

參考博客:

(MySQL)Spring3+Mybatis3使用注解式事務聲明(@Transactional)無法回滾

http://blog.csdn.net/hellostory/article/details/7197988

Spring @Transactional (一) 加強版

http://blog.csdn.net/cuker919/article/details/5957209

Spring transaction事務 roll back各種回滾

http://blog.csdn.net/hjm4702192/article/details/8520354


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM