我在这里看到了一个关于这个的问题,但是它很旧,所以如果现在存在解决方案,我会再次询问。
我的问题是这个。我有一个我想从中选择的数据库表,但我想锁定我选择的行。这样做的原因是我可能正在运行另一个进程,它也想选择相同的行,我想阻止这种情况。
想象一下,我有两个进程在做同样的事情。一个执行选择并开始执行数据处理。然后几秒钟后,下一个进程出现并进行选择,但由于行没有被锁定,它也需要相同的记录并开始处理它们。这当然是一个糟糕的情况。在 Oracle 中,您可以使用 SELECT FOR UPDATE 来锁定行以防止它们被第二个进程使用。这在 SQL Server 2008 中如何实现?
编辑:
我应该补充一点,我只能使用标准的 sql 语句。我无权访问过程、函数等。它必须通过一个简单的语句来完成。这是一个很长的故事和一个设计考虑,已经脱离了我的掌控。解决方案必须能够存储在表中,稍后检索,然后通过 C# 中的 ADO 对象运行,特别是分配给命令对象。
最终编辑:
如何将锁应用于此语句?
SELECT * FROM (SELECT TOP (20) * FROM [TMA_NOT_TO_ENTITY_QUEUE] WHERE [TMA_NOT_TO_ENTITY_QUEUE].[STATE_ID] = 2 ORDER BY TMA_NOT_TO_ENTITY_QUEUE.ID) a