使用JDBC声明式事务时事务未回滚

时间:2020-05-24 08:53:45

标签: java spring jdbctemplate spring-transactions

我正在尝试使用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

有人可以在这里帮助我吗,我在这里想念的是什么?理想情况下,目标帐户中的反映金额应回滚,因为提款以例外结束。

1 个答案:

答案 0 :(得分:1)

原因是因为默认情况下,Spring仅回滚未检查的异常。由于您的课程是已检查的异常,因为它不会扩展runtimeException但会扩展常规的Exception,所以它不会回滚。

您可以使用@Transactional批注中的rollBackFor属性并指定insuffientFundsException来修改此行为。