可重复读取和第二次丢失更新问题

2023-12-31

使用可重复读隔离级别,仍然有可能丢失更新(第二个丢失更新问题)。例如。在隔离级别设置为RR的场景中:

1)事务t1从r1行读取数据,

2)事务t2从r1行读取相同的数据,

3)t1修改#1中读取的数据并将数据提交给r1

4) t2修改#2中读取的数据并将数据提交给r1。 t1 的更新丢失

我用 Hibernate(隔离级别设置为 RR)尝试了这一点,并看到了如上所述的行为。

那么为什么说通过 RR 隔离我们不会遇到第二次丢失更新的问题呢?


你可以推断出在版本中您在本次测试中使用的 MySQL 的实现并不真正符合可重复读取,就像您在其他问题中所说的那样,因为如果您已经完成了

事务 t2 从 r1 行读取相同的数据

再次在步骤 4 中代替

t2 修改 #2 中读取的数据并将数据提交到 r1。

那么 t2 就会读取 t1 在步骤 3 中保存的值。 所以你一开始就没有可重复读,所以不属于可重复读丢失更新的情况。

ANSI SQL-92 根据现象定义隔离级别:脏 读取、不可重复读取和幻像。

而不是像你一开始想象的那样是锁当你说 https://stackoverflow.com/q/10040785/3517383

现在,据我了解,RR使用共享读锁和独占写 锁

这是因为

ANSI SQL 隔离设计者寻求一个可以容纳许多人的定义 不同的实现,而不仅仅是锁定。

事实上,这方面的一个例子是SQL SERVER 的 READ_COMMITED 实现 https://msdn.microsoft.com/es-es/library/ms173763(v=sql.120).aspx.

如果 READ_COMMITTED_SNAPSHOT 设置为 OFF(默认值),则数据库 引擎使用共享锁防止其他事务修改 当前事务正在运行读取操作时的行。 [...]

如果 READ_COMMITTED_SNAPSHOT 设置为 ON,则数据库引擎使用行 版本控制以呈现事务上一致的每个语句 语句开始时存在的数据快照。锁不用于保护数据不被其他人更新 交易.

丢失的更新不是这种现象之一,而是在对 ANSI SQL 隔离级别的批评 http://www.cs.umb.edu/%7Eponeil/iso.pdf阿格曼指出另一个问题 https://stackoverflow.com/questions/10040785/mysql-repeatable-read-and-lost-update-phantom-reads解释了可重复读取保证不会丢失更新:

P1 = 不可重复读取 P4 = 丢失更新 P2 的宽松解释(指定可能导致 到异常)是

P2: r1[x]...w2[x]...((c1 or a1) and (c2 or a2) in any order)

P2(指定实际异常)的严格解释(称为 A1)是

A2: r1[x]...w2[x]...c2...r1[x]...c1

虽然丢失更新的解释是

P4: r1[x]...w2[x]...w1[x]...c1

您提出的案例采用以下形式:

A4: r1[x]...r2[x]...w1[x]...c1...w2[x]...c2

乍一看,这似乎是一种没有不可重复读取的情况,实际上 t1 在整个事务中始终会读取相同的 x 值。

但如果我们关注 t2 并反转数字,我们可以看到这显然是不可重复读取的情况。

A4: r1[x]...r2[x]...w1[x]...c1...w2[x]...c2

A4: r1[x]...w2[x]...c2...w1[x]...c1(数字反转以提高可读性)

P2: r1[x]...w2[x]...((c1 或 a1) 和 (c2或a2) 以任何顺序)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可重复读取和第二次丢失更新问题 的相关文章

随机推荐

  • 对重载new和delete施加限制

    是否可以对重载运算符 new 和 delete 施加一些限制 我的重载 new 在另一个文件中链接到我的测试程序 场景是 if condition is satisfied call overloaded new else call the
  • 如何在android中卸载应用程序时清除数据库

    我使用数据库来存储消息 如果我卸载我的应用程序并再次重新安装相同的应用程序 数据库保持不变 但我想清除我的数据库 如何解决这个问题 要监听卸载事件 您必须实现收到的广播 例如
  • 在条件表达式中声明变量(三元运算符)

    是否可以在条件表达式中声明变量 例如 下面的代码返回语法错误 因为我已经在条件表达式中声明了变量 x var a document getElementById userData var d a value function d lengt
  • 在 Vue.js 中构建期间传递要由 .env.[mode] 文件使用的参数(命令行)

    Goal 传递一个在构建时使用的参数 以便能够在我的 env Production 文件中使用它 或者如果不可能的话 可以让我将它用作环境变量 env 生产文件 VUE APP CLIENT ID 00 should be using wh
  • 计算一行中 NULL 属性的数量

    我想在表中添加一个新列来记录每个元组 行 值为空的属性的数量 如何使用 SQL 获取号码 例如 如果一个元组是这样的 Name Age Sex Blice 100 null 我想更新元组如下 Name Age Sex nNULL Blice
  • EclipseLink 审核/历史记录/跟踪更改

    我尝试实现一种跟踪数据更改并为我的应用程序创建历史日志的方法 因为我正在使用 EclipseLink 所以应该很容易并且可以像它们一样获得更改写在 EclipseLink FAQ 上 http wiki eclipse org Eclips
  • 数组作为类的私有成员

    我正在尝试创建一个具有私有成员 数组 的类 我不知道数组的大小 直到将值传递到构造函数中才知道 定义类构造函数以及 h 文件中的定义以允许数组大小可变的最佳方法是什么 如果你想要一个 真正的 C 风格数组 你必须向你的类添加一个指针私有成员
  • 为什么此代码在 Xcode 模拟器上有效,但在设备上不起作用?

    我真的希望有人向我解释一下 我正在编写一个使用其设备 MAC 地址的应用程序 并且此代码在模拟器上完美运行 但在设备上不起作用 我从问题中得到了这个代码在 Objective C 中获取路由器 mac 无需系统调用 ARP https st
  • 有效的重新排序 - 根据新的 JMM

    我只是想知道以下重新排序在新的 JMM 模型下是否有效 Original Code instanceVar1 value normal read operation no volatile synchronized this instanc
  • 使用 Java 11 的独立 Nashorn 在 eval 时抛出 java.lang.StackOverflowError

    我遇到了 Nashorn 的一个问题 当评估一个大表达式时 它在 Java 8 中工作正常 但抛出一个java lang StackOverflowError在Java 11中 Exception in thread main java l
  • 初始化 GUID 变量:如何?

    我正在尝试初始化一个GUID http msdn microsoft com en us library windows desktop aa373931 28v vs 85 29 aspx变量 但我不确定这就是你应该做的事情 我特别困惑的
  • 如何根据其他变量设置一个变量

    我正在使用谷歌电子表格脚本 我在那里跟踪我的调度 我创建了一个按钮 按下该按钮时 将使用您所在的行来创建日历事件 我当前正在处理的问题是查找事件的任务类型和日期 我正在处理的 3 个专栏是 交付 集成 培训 都是日期 我的第一个 if el
  • 使用 CSS 实现鼠标点击放大和缩小

    我想仅使用 CSS 来缩放图像 下面的代码在按住鼠标左键时缩放图像 但我想通过单击鼠标来放大和缩小 我怎样才能做到这一点 container img transition transform 0 25s ease cursor zoom i
  • iOS - 使用外观全局更改导航栏标题颜色?

    这会使应用程序崩溃 UINavigationBar appearance setTitleColor UIColor darkGrayColor forState UIControlStateNormal 有没有办法使用外观来做到这一点 这
  • 为什么 CLLocationManager 在模拟器中的 iphone SDK 4 beta 上返回空位置?

    我有这段代码 void locationManager CLLocationManager manager didUpdateToLocation CLLocation newLocation fromLocation CLLocation
  • 如何对绑定到自定义对象集合的 DataGridView 进行排序?

    所以我一直在关注本指南适用于 Windows 窗体控件上的数据绑定 http www codeproject com Articles 24656 A Detailed Data Binding Tutorial MAD 支持作者 这个指南
  • 什么时候TextureView的“消费者端”关闭?

    Camera2 API 的 Google 官方示例之一 https github com googlesamples android Camera2Basic患有相同BufferQueue has been abandoned proble
  • 调整 JTable 中的一个单元格而不是整行

    我遇到了一个小问题 正在努力解决它 基本上发生的事情是我有一个 JTable 它由我从 API 调用获得的数组填充 我目前所拥有的是 如果设备显示为在线 它将变为绿色 如果离线 则变为浅灰色 问题是它影响整个 ROW 而不仅仅是状态 CEL
  • 是否可以在android程序中使用com.sun.net.httpserver包?

    我想在 Android 中创建一个 HTTP 服务器 我想在这个程序中使用 com sun net httpserver 您认为 可以在Android程序中使用这个包吗 我写了一个服务来做到这一点 我的程序如下 import android
  • 可重复读取和第二次丢失更新问题

    使用可重复读隔离级别 仍然有可能丢失更新 第二个丢失更新问题 例如 在隔离级别设置为RR的场景中 1 事务t1从r1行读取数据 2 事务t2从r1行读取相同的数据 3 t1修改 1中读取的数据并将数据提交给r1 4 t2修改 2中读取的数据