@Transactional失效的场景

引言

@Transactional注解相信大家都不陌生,在开发中经常使用保证程序可以要么同时成功要么同时失败。但是很多小伙伴只会使用,而不知道在什么场景下失败。今天就介绍下会失败的场景和原因,主要针对失败回滚,其他类型的错误类型这里不做介绍。 @Transactional(rollbackFor = Exception.class)。

使用的场景

只介绍类和方法,其他的不介绍(比如接口)。@Transactional可以放在类上时,表示所有该类的public方法都配置相同的事务属性信息。当放到方法上时如果类上也加了注解,方法的注解会覆盖类上的。

失效的场景(只针对失败回滚这种类型)

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

protected TransactionAttribute computeTransactionAttribute(Method method,
    Class<?> targetClass) {
        // 判断了方法是否是public修饰
        if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
        return null;

2.方法被try-- catch 捕获了,并且没把异常抛出去
3.比如有个用户user类,里面有一个a方法,一个b方法,b方法加了@Transactional,如果这时候在a方法调用b方法是不会生效的。原因是因为只有事务方法被当前类以外的代码调用时,才会被Spring管理,让@Transactional生效

//这两个方法是同一个类,因为shiwu方法是在自己类被调用的所以注解不会生效
    @Override
    public Long shiwuUpdate() {
        shiwu();
        return 1L;
    }

    @Transactional(rollbackFor = Exception.class)
    public void shiwu() {
        userMapper.update("张三");
            int i = 1/0;
    }

总结

@Transactional 失效的场景远不止这三种,上面总结的只是我在项目中常出现的应用,总结不到位的地方,望谅解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值