我正在尝试使用JDBC声明式事务和JDBC模板将资金从来源帐户转移到目的地帐户。
用例::如果我尝试在源帐户余额不足时调用 fundsTransfer 方法。在这种情况下,即使withdraw()抛出预期的InSufficientFundsExceptions,也会在目标帐户中添加金额。
@Autowired
JdbcTemplate jdbcTemp;
-----
-----
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void deposit(int accountNumber, double amount) {
String sql = "select Balance from <TableName> where Account_Number=?";
double balance = jdbcTemp.queryForObject(sql, Double.class, accountNumber);
balance = balance + amount;
String sql2 = "update <TableName> set Balance=? where Account_Number=?";
jdbcTemp.update(sql2, balance, accountNumber);
}
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void withdraw(int accountNumber, double amount) throws InSufficientFundsExceptions {
String sql = "select Balance from <TableName> where Account_Number=?";
double balance = jdbcTemp.queryForObject(sql, Double.class, accountNumber);
if (balance >= 5000) {
balance = balance - amount;
String sql2 = "update <TableName> set Balance=? where Account_Number=?";
jdbcTemp.update(sql2, balance, accountNumber);
} else {
throw new InSufficientFundsExceptions("InSufficientFunds Exception");
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public void fundsTransfer(int sourceAccountNumber, int destinationAccountNumber, double amount)
throws InSufficientFundsExceptions {
deposit(destinationAccountNumber, amount);
withdraw(sourceAccountNumber, amount);
}
注意:如果我们在fundsTranser中的deposit()之前调用withdraw(),则会得到预期的异常。
使用的数据库-SQLServer
有人可以在这里帮助我吗,我在这里想念的是什么?理想情况下,目标帐户中的反映金额应回滚,因为提款以例外结束。
答案 0 :(得分:1)
原因是因为默认情况下,Spring仅回滚未检查的异常。由于您的课程是已检查的异常,因为它不会扩展runtimeException但会扩展常规的Exception,所以它不会回滚。
您可以使用@Transactional批注中的rollBackFor属性并指定insuffientFundsException来修改此行为。