我想做资金转帐,从... ... 资料来源 帐户到 目的地 使用JDBC声明式事务和JDBC模板的账户。
用例。 如果我尝试调用 资金转移 当源账户没有足够的余额时,就会使用该方法。在这种情况下,尽管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);
}
注意:如果我们在deposit()方法之前调用withdraw()方法,那么目的账户中的金额就会被添加。 如果我们在fundsTranser中先调用withdraw()再调用deposit(),会得到预期的异常。
使用的数据库 - SQLServer
谁能帮我解决一下,我在这里遗漏了什么?理想情况下,目标账户中反映的金额应该得到回滚,因为取款结束时出现了异常。
原因是Spring默认只回滚未检查的异常。因为你的类是一个检查的异常,因为它没有扩展runtimeException,而是普通的Exception,所以它不做回滚。
你可以使用@Transactional annotation中的rollBackFor属性修改这个行为,并指定insuffientFundsException。