在阅读有关乐观锁的内容时,我遇到过使用如下所示版本控制的示例
UPDATE table SET column1 = new_value1, version = version + 1 WHERE id = some_id AND version = old_version
我无法理解它如何绝对安全。如果两个并发事务在更新期间读取相同的旧版本,然后都继续更新column1和版本,我们将在此处得到不正确的更新。除非 WHERE 和 SET 操作在数据库级别都是原子的(即事务一次性读取和更新),否则一个事务可以读取旧版本,但在更新新版本之前,另一个事务也可以读取相同的旧版本,并且然后两者都会继续更新版本,导致更新不正确。
我在这里缺少什么? MySql、Postgress 或 MS Sql Server 中如何处理此问题?
数据库服务器根本不允许出现您所描述的情况;不允许两个并发事务进行冲突的写入。
确切的细节取决于实现和各种事务设置,但典型的模式是,如果事务 X 对给定行有待处理的写入,并且事务 Y 尝试写入同一行,则事务 Y 将阻塞,直到事务 X 已提交或回滚;如果事务 X 最终被提交,那么事务 Y 将失败。
您可能对数据库事务冲突解决感兴趣,其中更详细地介绍了其中的某些方面。