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

时间:2019-06-17 06:57:53

标签: sql sql-server stored-procedures jdbc rdbms

我有一张桌子,如下:

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

此外,我有一个存储过程,该存储过程返回一个表,其中前100条记录的状态为“ na”。该存储过程可由环境中的多个节点调用,我不希望它们获取重复的数据。因此,我想在执行过程中锁定存储过程,并将从存储过程中获取的记录的状态设置为“进行中”,然后返回该表,然后释放该锁,以使不同的节点不会获取相同的内容数据。我该怎么办?

1 个答案:

答案 0 :(得分:1)

您可以将select与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隔离级别指定以下内容:

  • 语句无法读取已修改但尚未读取的数据 由其他交易承诺。
  • 没有其他事务可以修改已由 当前交易,直到当前交易完成。
  • 其他事务无法插入具有以下键值的新行: 属于当前的任何语句读取的键的范围 交易,直到当前交易完成。

Source (MSDN)