>我有一个表格如下:
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(