说我有如下表:选择并更新表,所以没有线程的重叠
ID|Read
-------
1|true
2|false
3|false
4|false
...我需要阅读的最小ID,有[阅读] ==虚假;另外,更新我现在已经阅读它。
因此,如果我执行我的存储过程dbo.getMinID,它将返回ID:2,并更新[Read] - > true。
CREATE PROCEDURE [dbo].[getMinID]
(
@QueryID INT OUTPUT
)
BEGIN
SELECT TOP 1 @QueryID = [ID] from Table
UPDATE Table SET [Read] = 1 WHERE [ID] = @QueryID
END
的问题是,我有十(10)异步线程执行dbo.getMinID,在同一时间,我不能有选择它们在任何情况下相同的[ID]。我担心我的SELECT和UPDATE语句之间执行第二个线程,因此在两种情况下返回[ID]:2。
无论有多少线程在存储过程中执行操作,我如何确保不会选择/更新同一个记录两次?另外,请记住,表CONSTANTLY添加了新的行,所以我不能锁定表!
min,不会触发所有行上的锁?或者我只是说废话 – 2010-01-21 13:11:33
共享锁是只读的,并且由于READPAST它将跳过其他锁。没关系,真的... – gbn 2010-01-21 13:52:21