new*_*bie 5 sql database sql-server sql-server-2005 sql-server-2008
我想要 :
我有并行进程一起完成同样的工作,我想确保所有人都能在独特的行上工作.我该如何确保?
我假设你在SQL Server上运行(因为标签),如果没有,那么我的答案不适用.单独锁定是不够的.如果使用数据库记录锁定,SqL服务器将阻止尝试访问锁定行的其他进程,实际上您一次只能处理一行.您的解决方案是将行锁定与READPAST提示相结合,以便跳过其他人锁定的行.以下是每个流程应该做的事情:
select top 1 id, ... from TheTable with (updlock, readpast) where flag = 0
//do the work now
update TheTable set flag = 1 where id=<previously retrieved id>
这里的好处是选择下一个未锁定行并锁定它的操作是原子的,因此它保证没有其他人能够选择同一行.