0
点赞
收藏
分享

微信扫一扫

@Transactional 失效的几种情况

登高且赋 2022-03-31 阅读 170

目录

一、非public修饰的方法

二、类内部访问

三、数据库不支持事务

四、异常类型不匹配

五、传播属性设置问题

六、捕获异常未抛出

七、未被Spring管理


一、非public修饰的方法

@Transactional注解只能在在public修饰的方法下使用。

/**
 * 私有方法上的注解,不生效
 */
@Transactional
private boolean test() {
    //test code
}

二、类内部访问

类内部非直接访问带注解标记的方法 B,而是通过类普通方法 A,然后由 A 调用 B。

@Service
public class Demo {
  public void A() {
    ......
    B();
  }
  
  @Transactional(rollbackFor = Exception.class)
  public void B() {
     ......
  }
}

三、数据库不支持事务

MySQL中,MyISAM引擎不支持事物,InnoDB 支持事物

四、异常类型不匹配

@Transactional注解默认处理运行时异常,即只有抛出运行时异常时,才会触发事务回滚,否则并不会如:

/**
 * 非运行异常,且没有通过 rollbackFor 指定抛出的异常,不生效
 *
 * @param id
 * @return
 * @throws Exception
 */
@Transactional
public boolean testException(int id) throws Exception {
    //运行代码
    throw new Exception("参数异常");
}

这种情况需指定异常,如: 

@Transactional(rollbackFor = Exception.class)

五、传播属性设置问题

有几种是不走事务执行的,所以也需要额外注意下,SpringBoot系列教程之事务传递属性。

propagation属性错误
@Transactional默认的事务传播机制是:REQUIRED,若指定成了NOT_SUPPORTED、NEVER事务传播机制,则事物不生效,如:

@Transactional(propagation = Propagation.NOT_SUPPORTED)

六、捕获异常未抛出

@Transactional
public void A(){
	try{
	   ......
	}catch(Exception e){
	   // 未抛异常
	}
}

七、未被Spring管理

// 注释调@Component,该类没被Spring管理,事物也是不生效的
public class Demo {
  
  @Transactional(rollbackFor = Exception.class)
  public void A() {
     ......
  }
}
举报

相关推荐

0 条评论