2010-01-27 144 views
2

我非常困惑。在Sql Server更新命令中丢失更新异常

我在READCOMMITTED隔离级别的事务。别的不说,我也更新它的计数器值,类似下面:

Update tblCount set counter = counter + 1 

我的应用程序是一个桌面应用程序,本次交易发生非常频繁地同时发生。我们最近注意到一个错误,有时计数器值不会被更新或错过。我们还在每个计数器更新中插入一条记录,以确保记录已插入,但计数器无法更新。这在2000年发生的一次是虚拟交易。

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

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

请帮帮忙,我有真的很困惑。

+3

你是否在交易中运行它本身?如果它不在事务中,则不会锁定任何内容,尽管您希望读取哪些数据。 – 2010-01-27 13:16:49

+0

没有WHERE子句? 2000个事务都试图更新同一行,这是不会扩展的。 – 2010-01-27 16:53:23

+0

是的,这是在隔离级别为ReadCommitted的.NET事务中,是的它在查询中有一个where子句,如下所示: 更新tblCount set counter = counter + 1其中counterID = 10 – Javed 2010-01-27 19:11:10

回答

1

您确定SQL始终成功吗?我的意思是,它可能是偶尔的锁定超时?您是否在处理.NET代码中的SQL异常时会注意到它们(即弹出消息或日志条目)?

2

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

还有别的事情上,我的第一个猜测将是您的交易回滚的另一个原因。例如,在这2000个交易中,有一个可能会回滚 - 特别是如果你同时做了很多事情 - 并且它根本没有成功。

该更新可能不会有什么问题引起的,无论是 - 你可能因涉及其他事务死锁,也可以先更新命令之前(update命令时或)将失败。

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