在項目中發現事務失效,使用@Transactional
注解標注的Service
業務層實現類方法全部不能回滾事務了,最終發現使用因為Spring與shiro進行整合之后導致的問題,將所有的Service
層實現類都添加如下注解
@Scope(proxyMode= ScopedProxyMode.TARGET_CLASS)
將代理方式換成CGLib
的代理方式之后得以解決,最終不明原因,如有看到這篇博客並知道答案的朋友請留言告知
如果事務不能回滾,也需要考慮如下幾點:
- 表得存儲引擎為
MyISAM
是沒有事務的,需要使用InnoDB
- 加事務的方法中手動
try...catch
住了異常,只有將異常拋出來(無論是主動還是被動)事務才能回滾 - Spring事務默認回滾的是
RunTimeException
運行時異常,如果是check
異常是不會回滾的,可以指定回滾異常,如下
@Transactional(rollbackFor = Exception.class)
只要出現異常就進行回滾