记一次Transactional注解错误使用的情况

        今天在review同事的代码时,发现他一个使用的Transactional错误的地方,大致的代码时

@XxlJob("XXXJOB")
@Transactional(rollbackFor = Exception.class)
public void XXXFun(){
    // 通过查询获取数据数组 list
    // 遍历 list
    list.forEach(data-> {
        // 生成新的数据 dataList
        // 调用 insertData方法
        insertData(dataList);
    });
}


public void insertData(final List<XXXDO> dataList) {
        // 批量插入
}

然后我就问他 为啥不是在 insertData 方法上加事务注解,这样的的好处有:

1. 事务大小变小了

2. 不同批次的数据相互之间不影响

然后他说试过在insertData加注解,但是没有生效,所以就在主方法XXXFun加注解。

我说你在同一个类里面调用方法,Transactional注解肯定失效啊,然后建议他去网上搜一下Transactional注解失效的场景有哪些。

这里 我也贴一下我知道的失效的场景:

  1. @Transactional 应用在非 public 修饰的方法上

  2. 同一个类中方法调用,导致@Transactional失效

由于使用Spring AOP代理,只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理。

比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。

         3. 异常没有抛出,被你的 catch“吃了”导致@Transactional失效

        4.  抛出的异常没有在rollbackFor 范围内

@Transactional注解是Spring框架中用于管理事务注解,它可以应用于类或方法上。使用注解可以确保一个方法或类中的操作要么全部成功提交,要么全部回滚,从而保证数据的完整性和一致性。下面是@Transactional注解的详细使用方法: 1.在类上使用@Transactional注解 在类上使用@Transactional注解,表示该类中的所有方法都将被纳入到事务管理中。例如: ```java @Service @Transactional public class UserServiceImpl implements UserService { // ... } ``` 2.在方法上使用@Transactional注解 在方法上使用@Transactional注解,表示该方法将被纳入到事务管理中。例如: ```java @Service public class UserServiceImpl implements UserService { @Override @Transactional public void addUser(User user) { // ... } } ``` 3.设置@Transactional注解的属性 @Transactional注解还有一些属性可以设置,例如: - propagation:事务的传播行为,默认值为REQUIRED。 - isolation:事务的隔离级别,默认值为DEFAULT。 - readOnly:是否只读事务,默认值为false。 - timeout:事务超时时间,默认值为-1,表示使用数据库默认超时时间。 - rollbackFor:指定哪些异常需要回滚事务。 - noRollbackFor:指定哪些异常不需要回滚事务。 例如: ```java @Service public class UserServiceImpl implements UserService { @Override @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 30, rollbackFor = Exception.class) public void addUser(User user) { // ... } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值