【问题标题】:Lost update in Concurrency control? [closed]并发控制中的更新丢失? [关闭]
【发布时间】:2009-05-12 22:04:28
【问题描述】:

我有两个在数据库中同时执行的事务 T 和 U。如何提供丢失更新问题的示例?

我们可以假设我们有 A、B、C 三个账户,它们分别有 100 英镑、200 英镑和 300 英镑。

【问题讨论】:

  • 这被标记为与编程无关。这似乎与我有关的编程很...
  • 嗯,这太笼统了 - 几乎不是一个真正的问题 - 请提供更多细节 - 谢谢。
  • 这是一个具有通用解决方案的非常具体的问题 - 尽管该问题显然是家庭作业或考试问题

标签: concurrency


【解决方案1】:

“丢失更新”问题与并发读取和数据更新有关,在读取器不会阻塞写入器的系统中。事务不必完全同时进行。

  1. 会话 #1 读取帐户 A,获得 100。
  2. 会话 #2 读取帐户 A,获得 100。
  3. 会话 #2 将帐户 A 更新为 150 (+50) 并提交。
  4. 会话 #1 将帐户 A 更新为 120 (+20) 并提交。

在这种情况下,由于会话 #1 不知道另一个会话已经修改了帐户,会话 #2 的更新被覆盖(“丢失”)。

有几种方法可以解决这个问题,例如版本号或前后比较。

【讨论】:

  • 版本号是指使用休眠的乐观锁定
  • 嗨,Anand,是的,据我了解,Hibernate 的乐观锁定实现涉及记录版本号的比较。不过,我不确定这是否是 Hibernate 支持的唯一方法。
【解决方案2】:

(3) 将帐户 A 更新为 150,其中帐户为 100 -> 帐户 A 现在为 150

(4) 将帐户 A 更新为 120,其中帐户为 100 -> 更新失败,因为帐户 A 是 150 而不是 100

【讨论】:

    【解决方案3】:

    当访问相同数据库项的两个事务以某种方式交错操作时会发生这种情况,从而使某些数据库项的值不正确。

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 1970-01-01
      • 2019-08-30
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多