我试图了解隔离级别和各种问题......即脏读、不可重复读、幻读和丢失更新。 正在阅读 Non repeatable read
还阅读过 Lost update
令我困惑的是,对我来说,这两个看起来非常相似,即在 NRR(不可重复读取)中,Tx B 更新了 Tx A 对同一行的两次读取之间的行,因此 Tx A 得到了不同的结果。
如果发生更新丢失 - Tx B 会覆盖 Tx A 提交的更改 所以对我来说,这两者似乎非常相似且相关。 这是正确的吗?
我的理解是,如果我们使用“乐观锁定”,它将防止“丢失更新”的问题 (基于一些非常好的答案 here )
我的困惑: 然而,这是否也意味着通过使用“乐观锁定”,我们也消除了“不可重复读取”的问题? 所有这些问题都与使用 Oracle 数据库的 Java J2EE 应用程序有关。
注意:为了避免分心,我不会寻找有关脏读和幻读的详细信息 - 我目前的重点完全是不可重复读和丢失更新
最佳答案
不可重复读、丢失更新、幻读以及脏读都与事务有关 isolation levels ,而不是悲观/乐观锁定。我相信Oracle的默认隔离级别是已提交读,这意味着仅防止脏读。
不可重复读取和丢失更新确实在某种程度上相关,因为它们可能会也可能不会发生在同一隔离级别上。除非您设置正确的隔离级别,否则这两种情况都不能通过锁定来避免,但您可以使用版本控制(每次更新时都会检查并递增的列值)来至少检测问题(并采取必要的措施)。
关于java - 丢失更新与不可重复读取有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58828807/