隔离级别和不一致状态

时间:2016-10-24 14:02:47

标签: java sql jpa transactions

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

  • 我的交易记为A

  • 另一项交易修改A和B

  • 然后我读了B

  • 我做了一些涉及A和B

  • 的业务逻辑

所以我会发现自己正在与一个从未存在过的国家合作..? 你是如何应对的?

2 个答案:

答案 0 :(得分:0)

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

居:

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

注意:如果K必须读A和B,但不能读A,它就不会无用地阻止B.

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

居:

  • 我读了A。
  • 另一个交易修改A和B.
  • 我读了B。
  • 我尝试做一些业务逻辑,但是控件说我“注意,A的值不会更新!”。
  • 我读了A的新值。
  • 我做了一些涉及A和B的业务逻辑。

答案 1 :(得分:0)

您应该提供更详细的信息,例如步骤1和3是在相同或不同的交易中执行。还要提一下步骤4,即"业务逻辑"读取或更新A和/或B.如果没有更多信息,则无法准确回答您的问题。在高层 -

  1. Read committed:您会看到已提交的行。在这种情况下,由于在另一个事务修改它之前读取了A(假设您的子弹描绘了事件I到IV的顺序),在步骤II之后可能没有最新值A.如果您在单独的交易中阅读B,则可能会在步骤II中看到B是最新的。

  2. 可重复读取:在同一事务中始终读取相同的数据。如果一个事务尝试修改A而另一个事务正在读取它,则根据并发控制机制,重复读取或更新将失败。

  3. P.S。要执行原子更新,您可以考虑使用"选择更新"查询。