@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各種回滾