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

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

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

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

@Transactional(rollbackFor = Exception.class) //一定要加 rollbackFor = Exception.class 参数,下面会说明原因: //一定要加 rollbackFor = Exception.class 参数,下面会说明原因:

如果你在写代码时候和我一样在类上或者在方法上加上@Transaction,就直接认为自己事务问题加好了。例如:

@Override
@Transactional
public void AddUserException() throws FileNotFoundException {}@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;
}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");
}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) 不管检查异常还是非检查异常都会回滚。如果感觉对你有用,算我没白忙活。一起同行。

 

 

 

 

 

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值