常见原因是方法自身调用、异常被吃、异常抛出类型不对。

原因

备注

数据库引擎不支持事务

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