当前位置: 代码迷 >> 综合 >> 注解事务不回滚 @Transactional
  详细解决方案

注解事务不回滚 @Transactional

热度:26   发布时间:2023-12-15 01:02:17.0

在我们开发中很多时候都要用到事务,例如转账等等的操作,这些我就不多BB了,哈哈。

下面我来说下关于Spring的声明式事务@Transaction的坑,我想最大的坑应该还是代理事务不生效的问题,下面放个链接,以免别人问。https://blog.csdn.net/weixin_41485592/article/details/80031597

下面我要说的又是一个坑,也是声明式事务不回滚的问题。重点来了 来了。。。。

@Transactional(rollbackFor = Exception.class) //一定要加 rollbackFor = Exception.class 参数,下面会说明原因:
如果你在写代码时候和我一样在类上或者在方法上加上@Transaction,就直接认为自己事务问题加好了。例如:

@Override
@Transactional
public void AddUserException() throws FileNotFoundException {}
这样的设置其实是存在问题的,之前我也是认为这样,我也想就这样他会默认添加传播属性什么的。下面我们实验看看有什么问题:

@Override
@Transactional
public void AddUserException() {
    SysUserEntity user=new SysUserEntity();
    user.setUniqueCode(UUIDGenerator.getUUID());
    user.setUsername("测试Exception");
    user.setPassword("我觉得我需要几个关注的粉丝哈哈。");
    user.setMobile("1095551903");
    sysUserDao.insert(user);
    int i=1/0;
}
实验结果:

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

再次实验:

@Override
@Transactional
public void AddUserException() throws FileNotFoundException {
    SysUserEntity user=new SysUserEntity();
    user.setUniqueCode(UUIDGenerator.getUUID());
    user.setUsername("测试Exception");
    user.setPassword("我觉得我需要几个关注的粉丝哈哈。");
    user.setMobile("1095551903");
    sysUserDao.insert(user);
    //int i=1/0;
    FileInputStream fis = new FileInputStream("D://a.txt");
}
实验结果:

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

此时你脑袋是不是出现一句卧槽,难道我之前写的。。。,哈哈哈哈快点回去改代码吧。

其实也并非都会有这种问题,这种问题出在你并没有捕获这个异常,直接向上抛出,如果捕获try catch 了然后又抛出一个自定义异常之类的,就不会出现这个问题。

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

简单说下异常吧,异常分为检查异常,和非检查异常(也就是运行时异常)。

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

而运行时异常,就是在运行时的产生异常(有点废话啊,不过就是这个意思),例如/by zero异常。

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

说了这么多,有点累了,不墨迹了,之前没打算写Demo想直接表述了的,后来今天突然发现我有一个粉丝了,哈哈哈哈哈所以写了个Demo。

解决方法。这样添加事务@Transactional(rollbackFor = Exception.class) 不管检查异常还是非检查异常都会回滚。如果感觉对你有用,算我没白忙活。一起同行。

原文:https://blog.csdn.net/weixin_41485592/article/details/80877665 
 

  相关解决方案