@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中的金额依然被扣除,很明显事务未被回滚。
解决方法如下:
声明式异常只有出现运行时 异常并且不被捕获才会回滚,在编程式事务中出现异常要显式的调用rollback进行回滚。1, 只捕获throw new RuntimeException();异常, 这时回滚
2, 用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();在声明式事务中显示的回滚