【问题标题】:Spring JdbcTemplate is update atomic?Spring JdbcTemplate 是更新原子的吗?
【发布时间】:2014-02-17 13:07:37
【问题描述】:

下面的 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});

如果同时发生两次此类更新会怎样?

谢谢,

【问题讨论】:

  • 你会得到一个例外:javax.persistence.OptimisticLockException or OptimisticLockingFailureException or other..
  • 但我没有明确定义锁定..
  • @Jaiwo99 我怀疑你是否会得到这样的异常,因为这里没有乐观并发检查
  • 我认为这在很大程度上取决于您使用的数据库和隔离级别,您用于 sql 连接
  • @AdrianShum 你是对的,这取决于数据库锁定策略..

标签: spring jdbc jdbctemplate


【解决方案1】:

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

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

【讨论】:

  • 我如何确保我的隔离级别对于任务是合法的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2015-07-09
相关资源
最近更新 更多