【问题标题】:Isolation level and inconsistent state隔离级别和不一致的状态
【发布时间】:2016-10-24 14:02:47
【问题描述】:

假设我已提交隔离级别读取

  • 我的事务读取为 A

  • 另一个事务修改了 A 和 B

  • 然后我读到 B

  • 我做了一些涉及 A 和 B 的业务逻辑

所以我会发现自己在一个从未存在过的状态中工作.. ?
你是如何应对的?

【问题讨论】:

    标签: java sql jpa transactions


    【解决方案1】:

    您应该提供更详细的信息,例如第 1 步和第 3 步是在相同的事务中执行还是在不同的事务中执行。还要提及第 4 步,即“业务逻辑”是否读取或更新 A 和/或 B。如果没有更多信息,就不可能准确回答您的问题。在高水平 -

    1. 读取已提交:您会看到已提交的行。在这种情况下,由于在另一个事务修改它之前读取了 A(假设您的项目符号描述了事件 I 到 IV 的序列),因此在步骤 II 之后您可能没有最新的值 A。如果您在单独的事务中读取 B,您可能会在步骤 II 中看到 B 是最新的。

    2. 可重复读取:在同一事务中一致地读取相同数据。如果一个事务试图修改 A 而另一个正在读取它,根据并发控制机制,重复读取或更新都会失败。

    附:要执行原子更新,您可以考虑使用“select for update”查询。

    【讨论】:

      【解决方案2】:

      一个解决方案是锁定一个资源,直到它被释放:

      Es:

      • 我读了A
      • 另一个事务 (K) 尝试修改 A,但它被阻止了,它不能。
      • 我读过 B.
      • 我做了一些涉及 A 和 B 的业务逻辑
      • K尝试修改A,因为A此时空闲,可以读取B。

      注意:如果 K 必须读取 A 和 B,但不能读取 A,它不会无用地阻塞 B。

      另一种解决方案是插入许多控件:

      Es:

      • 我读过 A.
      • 另一个事务修改了 A 和 B。
      • 我读过 B.
      • 我尝试做一些业务逻辑,但一个控件告诉我“注意,A 的值没有更新!”。
      • 我读取了 A 的新值。
      • 我做了一些涉及 A 和 B 的业务逻辑。

      【讨论】:

      • 您对可重复读取的看法是正确的,那么已提交的读取呢?
      • 相信我们只能警告读者,阅读后的数据可能会发生变化
      • 我找到了:" READ COMMITTED 指定语句不能读取其他事务修改但尚未提交的数据。这样可以避免脏读。其他事务可以在间隔内修改数据当前事务的单个语句,具有唯一性读取和存在幻像数据等后果。这是 SQL Server 中的默认选项。开启:msdn.microsoft.com/it-it/library/ms173763.aspx
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多