Spring事务和JdbcTemplate

时间:2019-07-19 20:46:17

标签: spring jdbc optimistic-locking

让我们说我们使用版本列来实现乐观锁定,并且我们发布如下更新:

UPDATE foo SET name = bar, version = 2 WHERE id = 1 AND version = 1

在基于Spring的应用程序中,我们有一个用Spring的@Transactional注释的服务,在一种方法中,我们使用JdbcTemplate发出了更新:

int results = jdbcTemplate.update(sql, params)

if (results == 0) {
    // throw exception
}

如果结果== 0,则该更新不会影响任何行,这意味着该行已经更新为新版本,或者可能已被删除,但是在任何情况下,我们的更新都不再有效。

如果结果> 0,则表示版本未更改,因此我们继续进行。

是否可能在发出jdbcTemplate.update时返回受影响的1行,但是在提交事务之前,其他某个进程提交了更改版本的更新?

因此,时间轴将类似于以下内容(假设p1和p2是不同jvm中应用程序的单独实例):

  1. p1检索foo id = 1
  2. p2检索foo id = 1
  3. p1发布更新并使受影响的行== 1
  4. p2发出更新,并且由于p1事务尚未提交,还使行== 1
  5. p1提交事务
  6. p2提交事务

这是否可行,或者即使p1事务尚未提交,p2也会在步骤4中看到来自step3的更改吗?

0 个答案:

没有答案