SpringJDBCTemplate是更新原子的吗?

SpringJDBCTemplate是更新原子的吗?,spring,jdbc,jdbctemplate,Spring,Jdbc,Jdbctemplate,以下jdbcTemplate更新脚本是线程安全的吗?它的基本功能是: balance -= amount; 代码如下: String sql = "update player.playerbalance b set b.balance = (b.balance - ?) where b.id = ? and b.balance >= ?"; jdbcTemplate = new JdbcTemplate(dataSource); int i = jdbcTemplate.update

以下jdbcTemplate更新脚本是线程安全的吗?它的基本功能是:

balance -= amount;
代码如下:

String sql = "update player.playerbalance b set b.balance = (b.balance - ?) where b.id = ? and b.balance >= ?";

jdbcTemplate = new JdbcTemplate(dataSource);

int i = jdbcTemplate.update(
            sql,
            new Object[] {wager, playerBalance.getId(), wager});
如果同时发生两次此类更新,会发生什么情况


谢谢,

这与线程安全无关。调用应该是线程安全的


DBMS将足够智能,以确保一个更新在同一记录的另一个更新到来之前完成(除非您将其设置为非常低的隔离级别)。因此,如果两个线程(或进程等)调用同一方法两次(使用相同的平衡ID),同一记录将被扣除两次。

您将得到一个异常:
javax.persistence.OptimisticLockException
OptimisticLockingFailureException
或其他。但我没有明确定义锁定。@Jaiwo99我怀疑您是否会得到这样的异常,因为这里没有乐观并发检查。我认为很大程度上取决于您使用的数据库和用于sql的隔离级别connection@AdrianShum你是对的,这取决于数据库锁定策略。如何确保我的隔离级别对于任务是合法的?