4

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

我有一个表,其中有数据,如下所示: 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 返回我的选择查询的结果,但删除命令也被执行。

基本上,我得到的序列号不超过 n 个,它们具有给定的 CategoryID,并且我删除了它们的行。

但是,在这里我有一个并发问题。如果上面的代码同时运行两次,结果可能会相同,但是,我们的想法是只从表中获取给定的 SerialNumber 一次。

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

在此先感谢您的帮助。

4

1 回答 1

3

您需要 READPAST、UPDLOCK、ROWLOCK 提示。有关更多信息,请参阅:SQL Server 进程队列竞争条件

然后你需要一个 SELECT/DELETE 事务。相反,您可以在一个带有OUTPUT 子句的语句中执行此操作

ExecuteQuery("delete top ({0})
                  DVDSerialNumbers WITH (READPAST, UPDLOCK, ROWLOCK)
              OUTPUT DELETED.SerialNumber
              where CategoryID = {1}" & 
                , n, CategoryID)
于 2011-08-26T10:50:11.210 回答