让我们说我们使用版本列来实现乐观锁定,并且我们发布如下更新:
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中应用程序的单独实例):
这是否可行,或者即使p1事务尚未提交,p2也会在步骤4中看到来自step3的更改吗?