我有许多.NET进程从SQL Server 2008数据库表中读取消息并逐个处理它们。我实现了一个简单的存储过程来“锁定”正在被任何一个进程读取的行,以避免任意两个进程处理同一行。
BEGIN TRAN
SELECT @status = status FROM t WHERE t.id = @id
IF @status = 'L'
BEGIN
-- Already locked by another process. Skip this
RETURN 0
END
ELSE
UPDATE t SET status = 'L' WHERE id = @id
RETURN 1
END
COMMIT
然而,这种方法有缺陷:有时一行数据会被“锁定”并被处理两次。我怀疑存在并发问题:两个进程在一个更新状态之前读取了该状态。
我认为可以通过某种方式实现读取块(即使事务块读取),但我不确定如何做到这一点。有人能帮忙吗?
非常感谢
Ryan