我知道不可重复读取问题发生在事务 t1 检索一行时,事务 t2 然后更新该行,然后事务 t1 再次检索同一行。T1 检索了同一行,但看到了两个不同的值。我想知道为什么事务再次读取同一行。为什么它不使用旧值?如果它再次检索以获取更新的值,则获取不同的值应该不是问题。你能解释一下吗?什么时候应该使用可重复读隔离级别?
我知道不可重复读取问题发生在事务 t1 检索一行时,事务 t2 然后更新该行,然后事务 t1 再次检索同一行。T1 检索了同一行,但看到了两个不同的值。我想知道为什么事务再次读取同一行。为什么它不使用旧值?如果它再次检索以获取更新的值,则获取不同的值应该不是问题。你能解释一下吗?什么时候应该使用可重复读隔离级别?
我的猜测是开发人员根本没有考虑并发更新的可能性以及相关的复杂性。
假设 T1 是一个显式事务(即它有 Begin Tran、Commit Tran),我相信在可重复读取隔离级别下运行 T1 会保护您免受这个特定问题的影响。但是,它可能会导致不必要的阻塞或死锁。
如果一个有问题的行是唯一可能的问题,那么使用 WITH (UPDLOCK) 提示选择它一次可能就足够了,这将阻止其他事务修改它直到 T1 完成。然而,其他事务仍将能够读取该行(然后可能由 T1 更新),除非它们也使用 WITH (UPDLOCK)。