使用JDBC声明式事务时,事务没有得到回滚。

问题描述 投票:0回答:1

我想做资金转帐,从... ... 资料来源 帐户到 目的地 使用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

谁能帮我解决一下,我在这里遗漏了什么?理想情况下,目标账户中反映的金额应该得到回滚,因为取款结束时出现了异常。

java spring jdbctemplate spring-transactions
1个回答
1
投票

原因是Spring默认只回滚未检查的异常。因为你的类是一个检查的异常,因为它没有扩展runtimeException,而是普通的Exception,所以它不做回滚。

你可以使用@Transactional annotation中的rollBackFor属性修改这个行为,并指定insuffientFundsException。

© www.soinside.com 2019 - 2024. All rights reserved.