Sql Server更新命令中丢失的更新异常

时间:2010-01-27 13:13:40

标签: sql-server concurrency transactions

我非常困惑。

我在ReadCommitted Isolation级别有一个事务。除此之外,我还在更新其中的计数器值,类似于下面的内容:

Update tblCount set counter = counter + 1

我的应用程序是桌面应用程序,此事务恰好经常发生并发生。我们最近注意到一个错误,有时计数器值不会更新或错过。我们还在每个计数器更新中插入一条记录,因此我们确保已插入记录,但计数器无法更新。这种情况在2000年的同时交易中发生过一次。

我严重怀疑这是一个丢失的更新异常,但是如果你查看上面的命令,它只是从它自己的值更新计数器:如果我已经启动了一个事务并且事务已经达到了这个语句,它应该锁定了这一行。这不应该导致更新丢失,但它会以某种方式发生。

此更新命令是否分两部分工作?首先它读取计数器值(在此期间它不会获得独占锁定),然后写入新的计算值(当它获得独占锁定时)?

请帮助,我真的很困惑。

2 个答案:

答案 0 :(得分:2)

更新命令不能分两部分工作。它只适用于一个。

还有其他事情发生了,我的第一个猜测是你的交易因为其他原因而回滚。例如,在这2000笔交易中,有一笔交易可能正在回滚 - 特别是如果你同时做了很多事情 - 而且它根本没有成功。

该更新可能不是导致问题的原因 - 您可能因其他事务而涉及死锁,并且它们可能在更新命令之前(或在更新命令期间)失败。

我会缩小并询问有关交易错误处理的问题。你在try / catch块中做了什么吗?当事务失败时,您是否捕获错误级别?如果没有,您需要使用Profiler捕获跟踪以找出正在发生的事情。

答案 1 :(得分:1)

您确定SQL总是成功吗?我的意思是,它可能是偶尔的锁定超时吗?您是否以一种能够识别它们的方式处理.Net代码中的SQL异常(即弹出消息或日志条目)?