常见原因是方法自身调用、异常被吃、异常抛出类型不对。
原因 | 备注 |
数据库引擎不支持事务 | MySQL的InnoDB引擎支持事务,但是MyISAM不支持的。注意MySQL5.5.5之前默认引擎是MyISAM |
类没有被Spring管理 | 注解@Service,类才被Spring加载成Bean |
方法不是public | 注解@Transactional用于public的方法,或者开启AspectJ代理模式 |
方法的自身调用问题 | 通过Spring代理类在外部调用事务时@Transactional才生效 |
数据源没有配置事务管理器 | 为数据源配置事务管理器 |
方法被声明为不支持事务 | @Transactional(propagation = Propagation.NOT_SUPPORTED)已经声明了该方法不支持事务 |
异常被吃了 | 异常处理时没有抛出 |
异常抛出类型错误 | 默认事务回滚异常是RuntimeException,可以指定其他异常:@Transactional(rollbackFor = Exception.class) |
原文链接:《Java技术栈》https://mp.weixin.qq.com/s/6EpeHAF5UmFzEuaQPWjdTw