java - 丢失更新与不可重复读取有何不同?

标签 java oracle transactions locking optimistic-locking

我试图了解隔离级别和各种问题......即脏读、不可重复读、幻读和丢失更新。 正在阅读 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/

相关文章:

java - 动态 JComboBox

java - 如何修复反编译 .class 为 .java 错误

java - 在 Solr DataImportHandler 中从 Oracle 日期获取正确的时间

SQL 隔离级别、读写锁

mysql - SQL 事务 ELSE IF 和 SELECT

Java 对象引用/范围问题

java - 小程序无法从 jar 加载文件

sql - 为什么 Oracle 在取消引用对象时需要 View 中列的别名?

Oracle即时客户端部署?

java - 在同一个表的同一事务中绑定(bind) springjdbc 和 hibernate session 工厂