在項目中發現事務失效,使用@Transactional注解標注的Service業務層實現類方法全部不能回滾事務了,最終發現使用因為Spring與shiro進行整合之后導致的問題,將所有的Service層實現類都添加如下注解
@Scope(proxyMode= ScopedProxyMode.TARGET_CLASS)

將代理方式換成CGLib的代理方式之后得以解決,最終不明原因,如有看到這篇博客並知道答案的朋友請留言告知
如果事務不能回滾,也需要考慮如下幾點:
- 表得存儲引擎為
MyISAM是沒有事務的,需要使用InnoDB - 加事務的方法中手動
try...catch住了異常,只有將異常拋出來(無論是主動還是被動)事務才能回滾 - Spring事務默認回滾的是
RunTimeException運行時異常,如果是check異常是不會回滾的,可以指定回滾異常,如下
@Transactional(rollbackFor = Exception.class)
只要出現異常就進行回滾
