【发布时间】:2016-10-24 14:02:47
【问题描述】:
假设我已提交隔离级别读取
我的事务读取为 A
另一个事务修改了 A 和 B
然后我读到 B
我做了一些涉及 A 和 B 的业务逻辑
所以我会发现自己在一个从未存在过的状态中工作.. ?
你是如何应对的?
【问题讨论】:
标签: java sql jpa transactions
假设我已提交隔离级别读取
我的事务读取为 A
另一个事务修改了 A 和 B
然后我读到 B
我做了一些涉及 A 和 B 的业务逻辑
所以我会发现自己在一个从未存在过的状态中工作.. ?
你是如何应对的?
【问题讨论】:
标签: java sql jpa transactions
您应该提供更详细的信息,例如第 1 步和第 3 步是在相同的事务中执行还是在不同的事务中执行。还要提及第 4 步,即“业务逻辑”是否读取或更新 A 和/或 B。如果没有更多信息,就不可能准确回答您的问题。在高水平 -
读取已提交:您会看到已提交的行。在这种情况下,由于在另一个事务修改它之前读取了 A(假设您的项目符号描述了事件 I 到 IV 的序列),因此在步骤 II 之后您可能没有最新的值 A。如果您在单独的事务中读取 B,您可能会在步骤 II 中看到 B 是最新的。
可重复读取:在同一事务中一致地读取相同数据。如果一个事务试图修改 A 而另一个正在读取它,根据并发控制机制,重复读取或更新都会失败。
附:要执行原子更新,您可以考虑使用“select for update”查询。
【讨论】:
一个解决方案是锁定一个资源,直到它被释放:
Es:
注意:如果 K 必须读取 A 和 B,但不能读取 A,它不会无用地阻塞 B。
另一种解决方案是插入许多控件:
Es:
【讨论】: