SQL从表中选择行并更新相同的行

new*_*bie 5 sql database sql-server sql-server-2005 sql-server-2008

我想要 :

  1. 从表中选择N行以进行处理,其中flag = 0
  2. 使用来自这N行的值在第二个表上进行一些工作
  3. 更新这N行并设置flag = 1

我有并行进程一起完成同样的工作,我想确保所有人都能在独特的行上工作.我该如何确保?

nig*_*tch 5

我假设你在SQL Server上运行(因为标签),如果没有,那么我的答案不适用.单独锁定是不够的.如果使用数据库记录锁定,SqL服务器将阻止尝试访问锁定行的其他进程,实际上您一次只能处理一行.您的解决方案是将行锁定与READPAST提示相结合,以便跳过其他人锁定的行.以下是每个流程应该做的事情:

  1. 选择下一个未锁定的行进行处理并锁定它
  2. 做的工作
  3. 更新行和结束事务

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>

这里的好处是选择下一个未锁定行并锁定它的操作是原子的,因此它保证没有其他人能够选择同一行.