CSh*_*ned 4 locking sql-server-2008
我在这里看到了一个关于这个的问题,但它已经老了,所以如果现在有解决方案,我会再问一次.
我的问题是这个.我有一个数据库表,我想从中选择,但我想锁定我选择的行.这样做的原因是我可能正在运行另一个进程,它也想要选择相同的行,我想阻止它.
想象一下,我有两个进程做同样的事情.一个人执行选择并开始执行其数据处理.然后几秒钟后,下一个进程出现并进行选择,但由于行未锁定,因此它也会采用相同的记录并开始处理它们.这当然是一个糟糕的情况.在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
Run Code Online (Sandbox Code Playgroud)
您需要使用其中一个所谓的表提示:
该更新锁可以防止其他进程试图更新或删除该行-但它并不妨碍读访问:
SELECT TOP (20) *
FROM [TMA_NOT_TO_ENTITY_QUEUE] WITH (UPDLOCK)
WHERE [TMA_NOT_TO_ENTITY_QUEUE].[STATE_ID] = 2
ORDER BY TMA_NOT_TO_ENTITY_QUEUE.ID
Run Code Online (Sandbox Code Playgroud)
还有一个独占锁,但基本上,更新锁应该足够了.使用更新锁选择行后,这些行将受到"保护"以防止更新和写入,直到您的事务结束.