使用sql Server的事务隔离级别,可以避免某些不必要的并发问题,如脏读等.
我现在感兴趣的是丢失的更新 – 事实上,两个事务可以覆盖彼此的更新,而没有任何人注意到.我看到并听到关于最低限度的隔离级别的冲突声明,我必须选择避免这种情况.
Kalen Delaney在她的“sql Server内部”一书中说(第10章 – 事务和并发 – 第592页):
在读取未提交的隔离中,除了丢失更新之外,上述所有行为都是可能的.
另一方面,独立的sql Server培训师给我们一个类告诉我们,我们至少需要“可重复读取”来避免丢失更新.
那么谁是对的?为什么?
解决方法
本书中的例子是文员A和文员B接收小部件的发货.
他们都检查当前库存,见25库存.文员A有50个小部件和更新到75,文员B有20个小部件,所以更新45覆盖以前的更新.
我认为她的意思是这个现象可以避免在所有的隔离级别的文员A做
UPDATE Widgets SET StockLevel = StockLevel + 50 WHERE ...
和文员B做
UPDATE Widgets SET StockLevel = StockLevel + 20 WHERE ...
当然,如果SELECT和UPDATE作为单独的操作完成,则需要重复的读取才能避免这种情况,因此在该事务的持续时间内保持该行的S锁定(这将导致此情况下的死锁)