SQL server表锁定和解锁问题

时间:2011-08-26 10:42:58

标签: sql-server locking unlock

我有一个非常有趣的问题。

我有一张表格,我有数据,如下所示: DVDSerialNumbers(ID,Create_Date,SerialNumber,CategoryID)

我的应用程序生成DVD的序列号,我有一个像这样的SQL命令(由我的应用程序发出):

ExecuteQuery("select top {0} SerialNumber from DVDSerialNumbers where CategoryID = {1};" & 
"delete from DVDSerialNumbers where ID in (select top{0} ID from DVDSerialNumber where " & 
 "CategoryID = {1});", n, CategoryID)

ExecuteQuery返回我的select查询的结果,但也执行了delete命令。

基本上我只得到n个具有给定CategoryID的SerialNumbers,我删除它们的行。

然而,在这里我有一个确定性的问题。 如果上面的代码在同一时间运行两次,那么结果可能是相同的,但是,想法是从表中只获取一次给定的SerialNumber。

如何让实例B等待实例A完成此命令?我应该锁桌子吗?或者我应该锁定一些行?或者有更好的解决方案吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您需要READPAST,UPDLOCK,ROWLOCK提示。有关详情,请参阅此处:SQL Server Process Queue Race Condition

然后你需要一个SELECT / DELETE事务。相反,您可以使用OUTPUT clause

在一个语句中执行此操作
ExecuteQuery("delete top ({0})
                  DVDSerialNumbers WITH (READPAST, UPDLOCK, ROWLOCK)
              OUTPUT DELETED.SerialNumber
              where CategoryID = {1}" & 
                , n, CategoryID)