@Transactional声明式事务不回滚的正确使用

//一定要加 rollbackFor = Exception.class 参数

@Transactional(rollbackFor = Exception.class)

如果在写代码时候只加上@Transaction

这样的设置其实是存在问题的:

场景1:

            @Override
            @Transactional
            public void AddUserException() {
                User user=new User();
                user.setUniqueCode(UUIDGenerator.getUUID());
                user.setUsername("test");
                user.setPassword("passwd");
                user.setMobile("110119111");
                userDao.insert(user);
                int i=1/0;
            }

实验结果:

抛出  / by zero,事务回滚成功

场景2:

            @Override
            @Transactional
            public void AddUserException() throws FileNotFoundException {
                User user=new User();
                user.setUniqueCode(UUIDGenerator.getUUID());
                user.setUsername("test");
                user.setPassword("passwd");
                user.setMobile("110119111");
                userDao.insert(user);
                int i=1/0;
                FileInputStream fis = new FileInputStream("Users/lli/a.txt");
            }

实验结果:

抛出异常java.io.FileNotFoundException,事务并未回滚

 

具体原因:使用@Transaction 时默认为RuntimeException(也就是运行时异常)异常才会回滚。

异常分为检查异常,和非检查异常(也就是运行时异常)。

检查异常例如IOException异常等,在你写代码时编译提示你必须try catch 或向上抛,反正就是必须处理。

而运行时异常,就是在运行时的产生异常,例如/by zero异常。

所以当我们上面实验抛出java.io.FileNotFoundException检查异常时导致了数据的不回滚。

解决方法:添加事务@Transactional(rollbackFor = Exception.class) 不管检查异常还是非检查异常都会回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值