如何锁定正在执行的存储过程并更改存储过程返回的表



>我有一个表格如下:

id    status
--    ------
1     pass
1     fail
1     pass
1     na
1     na

此外,我有一个存储过程,它返回一个表,其中包含状态为"na"的前 100 条记录。存储过程可以由环境中的多个节点调用,我不希望它们获取重复的数据。因此,我想在存储过程执行时锁定存储过程,并将从存储过程获取的记录的状态设置为"正在进行"并返回该表,然后释放锁,以便不同的节点不会获取相同的数据。我将如何实现这一点?

您可以使用具有

WITH (SERIALIZABLE)隔离级别的选择来确保记录被锁定,直到状态更新,如下所示。

SELECT TOP 100 id 
INTO   #temp 
FROM   [your_table] WITH (serializable) 
WHERE  status = 'na' 
UPDATE ut 
SET    status = 'In Progress' 
FROM   [your_table] ut WITH (serializable) 
       INNER JOIN #temp T 
               ON T.id = ut.id 

SERIALIZABLE隔离级别 指定以下内容:

  • 语句无法读取已修改但尚未修改的数据由其他事务提交。
  • 没有其他事务可以修改已由当前事务,直到当前事务完成。
  • 其他事务无法插入具有键值的新行,这些键值会落在当前事务,直到当前事务完成。

源 (MSDN(

最新更新