0
点赞
收藏
分享

微信扫一扫

@Transactional 失效的几种情况

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

目录

一、非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 条评论