美团一面:@Transactional 原理和常见的坑?

Java 后端面试的时候,面试官经常会问到 @Transactional 的原理,以及容易踩的坑,今天就带大家把这几块知识吃透。

这篇文章,会先讲述 @Transactional 的 4 种不生效的 Case,然后再通过源码解读,分析 @Transactional 的执行原理,以及部分 Case 不生效的真正原因。

项目准备

下面是 DB 数据和 DB 操作接口:

uid uname usex
1 张三
2 陈恒
3 楼仔
// 提供的接口
public interface UserDao {
    // select * from user_test where uid = "#{uid}"
    public MyUser selectUserById(Integer uid);
    // update user_test set uname =#{uname},usex = #{usex} where uid = #{uid}
    public int updateUser(MyUser user);
}

基础测试代码,testSuccess() 是事务生效的情况:

@Service
public class UserController {
    @Autowired
    private UserDao userDao;

    public void update(Integer id) {
        MyUser user = new MyUser();
        user.setUid(id);
        user.setUname("张三-testing");
        user.setUsex("女");
        userDao.updateUser(user);
    }

    public MyUser query(Integer id) {
        MyUser user = userDao.selectUserById(id);
        return user;
    }

    // 正常情况
    @Transactional(rollbackFor = Exception.class)
    public void testSuccess() throws Exception {
        Integer id = 1;
        MyUser user = query(id);
        System.out.println("原记录:" + user);
        update(id);
        throw new Exception("事务生效");
    }
}

事务不生效的几种 Case

主要讲解 4 种事务不生效的 Case:

  • 类内部访问:A 类的 a1 方法没有标注 @Transactional,a2 方法标注 @Transactional,在 a1 里面调用 a2;

  • 私有方法:将 @Transactio

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Transactional是Spring框架中用来管理事务的注解,它可以将一组操作作为一个事务来执行,如果其中任何一个操作失败,则整个事务将被回滚,以保证数据的一致性和完整性。 @Transactional的工作原理是在方法执行前创建一个事务,方法执行完毕后,如果没有发生异常,则提交事务,否则回滚事务。这个过程是由Spring框架通过AOP技术实现的。 然而,在一些场景下,@Transactional可能会失效,比如: 1. 事务注解被应用在了非public方法上。只有public方法才能被Spring框架所代理,因此,如果事务注解被应用在了非public方法上,那么它将不会生效。 2. 事务注解被应用在了static方法上。同样地,Spring框架只会代理非static方法,因此,如果事务注解被应用在了static方法上,那么它将不会生效。 3. 异常被catch住了。如果在事务中发生了异常,但是异常被catch住了,那么事务将不会回滚。 4. 方法中调用了同一个类中的其他方法。如果在同一个类中的方法中调用了其他方法,那么事务注解可能会失效。这是因为Spring通过代理来实现事务管理,而代理只能拦截方法调用,无法拦截同类中的方法调用。 5. 多个事务注解嵌套使用。如果在一个方法中使用了多个@Transactional注解,并且它们的传播级别不同,那么可能会导致事务失效。这是因为Spring不支持嵌套事务的回滚。 了解这些场景可以帮助我们更好地使用@Transactional注解,从而保证数据的一致性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值