@Transactional注解失效的几种场景

事务的隔离级别:propagation
1.PROPAGATION_REQUIRED: 如果当前已经存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值。
2.PROPAGATION_SUPPORTS:如果当前已经存在事务,那么加入该事务,否则创建一个所谓的空事务(可以认为无事务执行)
3.PROPAGATION_MANDATORY:当前必须存在一个事务,否则抛出异常。
4.PROPAGATN_REQUIRES_NEW:暂停当前事务(当前无事务则不需要),创建一个新事务。 针对这种情况,两个事务没有依赖关系,可以实现新事务回滚了,但外部事务继续执行。
5.Propagation.NOT_SUPPORTED:如果当前存在事务,挂起当前事务,然后新的方法在没有事务的环境中执行,没有spring事务的环境下,sql的提交完全依赖于 defaultAutoCommit属性值
6.PROPAGATION_NEVER:如果当前存在事务,则抛出异常,否则在无事务环境上执行代码。
7.PROPAGATION_NESTED:

一.@Transactional注解失效的几种场景
1.@Transactional注解默认回滚runtimeexception及子类的异常情况,如果抛出非runtimeexception异常不会回滚。
eg1:
@Transactional
@Override
public void test() throws Exception {
ScheduleTaskPo po = new ScheduleTaskPo();
po.setCron("aa");
po.setEventClassName("com");
po.setTaskName("事务");
po.setCreateTime(DateTimeUtil.now());
po.setUpdateTime(DateTimeUtil.now());
scheduleTaskDao.add(po);
throw new Exception("异常");
}
此时不会回滚,如果想回滚exception异常,改为@Transactional(rollbackFor = Exception.class)
rollbackFor:指定需要回滚的异常,noRollbackFor:指定不需要回滚的异常

2.如果数据库不支持事务也不会回滚,myisam引擎不支持事务,用innodb代替。

3.@Transactional修饰的方法必须为public的,不然注解失效

4.在一个没有事务的方法调用有事务的方法,事务不会回滚。如果这两个方法在同一个类中,
A方法有事务的话调用B方法,不管B方法有没有事务都会运行在A方法事务中。
如果A没有事务,则B就是加了事务也不会回滚。如果要让B事务可以回滚则可以注入当前类的实例,
用bean调用B方法,避免直接调用B方法(这样不会走代理).

5.如果异常被catch了而没有抛出来也不会回滚

6.如果A类有A方法不加事务,B类有B方法加事务,A方法调用B方法,如果B方法抛异常事务会回滚,
如果调用B方法后A方法继续执行抛异常则B方法的事务不回滚。

你可能感兴趣的:(@Transactional注解失效的几种场景)