【发布时间】:2014-11-20 13:56:15
【问题描述】:
要在 SQL Server 2012 中为我的更新任务实现多线程,我需要让不同的线程从表(帐户)中选择一行并将该行标记为使用存储过程中的更新处理。
类似这样的:
create procedure ChooseNextAccountToProcess (@Account_ID Int Output)
select top 1 @Account_ID = Account_ID
from Accounts
order by LastProcessDate Desc
update Accounts
set LastProcessDate = getdate()
where Account_ID = @Account_ID
go
这种方法的问题是两个线程可能同时调用这个存储过程并处理同一个帐户。我的目标是从帐户表中选择一个帐户并在更新有机会更新它之前专门锁定它。
我尝试了SELECT .... WITH (UPDLOCK) 和WITH Exclusive lock,但是当我选择该行时,这些都不能真正在该行上设置排他锁。
有什么建议吗?
【问题讨论】:
-
为什么不直接更新呢?这将立即锁定该行。
-
如果您确实需要捕获 Account_ID,您可以使用 OUTPUT 来完成。从您发布的内容来看,这确实应该是一个单行程序。
标签: sql sql-server multithreading