我有许多.NET进程从SQL Server 2008数据库表读取消息,并一次处理一个消息。我实现了一个简单的SP来'锁定'正在被任何一个进程读取的行,以避免任何两个进程处理同一行。从sp中执行读操作时阻止一行sp执行
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
但是,这是有缺陷的:有时一行被'锁定'并处理两次。我怀疑有一个并发问题:两个进程在更新之前先读取状态。
我认为这可以通过以某种方式实现读取块(即使事务块读取)来解决,但我不确定如何执行此操作。谁能帮忙?
感谢很多提前
瑞安
我应该补充一点,进程是独立的.net进程,而不是多线程的单个执行,所以这不能在c#编程级别解决。 – Ryan 2010-07-29 13:11:15