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

来源:互联网 发布:2016中国象棋软件排名 编辑:程序博客网 时间:2024/06/04 18:00
@Transactionalpublic 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进行回滚。

阅读全文
1 0
原创粉丝点击