解决Spring的声明式事务中的自定义异常不回滚问题

@Transactional
	public void opreateAccount(int fromUserId, int toUserId, BigDecimal money) {
		System.out.println("转账开始!!");
		try{
			//根据id获取转出用户金额
			BigDecimal fromaccount = userdao.getAccount(fromUserId);
			if(fromaccount.compareTo(money) >= 0){
				userdao.subMoney(fromUserId, money);
				
//				int i = 1/0;
				if(true){
					throw new UserAccountException("抛异常!!");
				}
				
				userdao.addMoney(toUserId, money);
			}else
			{
				throw new UserAccountException("用户金额不足!!");
			}
		} catch(UserAccountException e){
			e.printStackTrace();
		}
		System.out.println("转账完成!!");
	}

在红色代码处抛出自定义异常,异常类继承了Exception类。

在测试上述代码(测试用例为将账户id为3的用户转账50元到账户id为5的账户)后发现,异常被捕获,fromUserId中的金额依然被扣除,很明显事务未被回滚。

解决方法如下:

1, 只捕获throw new RuntimeException();异常, 这时回滚

2, 用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();在声明式事务中显示的回滚

声明式异常只有出现运行时 异常并且不被捕获才会回滚,在编程式事务中出现异常要显式的调用rollback进行回滚。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值