在我们开发中很多时候都要用到事务,例如转账等等的操作,这些我就不多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