在项目中发现事务失效,使用@Transactional
注解标注的Service
业务层实现类方法全部不能回滚事务了,最终发现使用因为Spring与shiro进行整合之后导致的问题,将所有的Service
层实现类都添加如下注解
@Scope(proxyMode= ScopedProxyMode.TARGET_CLASS)
将代理方式换成CGLib
的代理方式之后得以解决,最终不明原因,如有看到这篇博客并知道答案的朋友请留言告知
如果事务不能回滚,也需要考虑如下几点:
- 表得存储引擎为
MyISAM
是没有事务的,需要使用InnoDB
- 加事务的方法中手动
try...catch
住了异常,只有将异常抛出来(无论是主动还是被动)事务才能回滚 - Spring事务默认回滚的是
RunTimeException
运行时异常,如果是check
异常是不会回滚的,可以指定回滚异常,如下
@Transactional(rollbackFor = Exception.class)
只要出现异常就进行回滚