如何锁定行,并在多个事务中使用锁定?

And*_*son 0 sql locking race-condition azure-sql-database

我有一种情况需要:

  1. 读取行的值.
  2. 如果某列的值为"X",则执行操作A.否则,执行操作B.
  3. 如果我们执行了操作A,请使用操作结果更新列.

操作A不是数据库操作,可能需要一段时间才能运行,并且它不可逆.操作B不是数据库操作,但运行速度非常快.该序列在多个服务器上的多个线程上执行.

目前我们没有锁定,所以偶尔我们会看到动作A被执行多次,而它应该只发生一次.我认为我唯一的解决方案是以某种方式将上面的序列包含在获取锁定步骤和释放锁定步骤中,我不知道该怎么做.

我看到了一个类似的问题,答案是在行中添加"锁定"和"查询时间"列.然而,在那种情况下,OP并不担心经常重新获得锁定.如果每次我想执行序列时必须旋转等待上一次锁定到期,我的服务器性能可能会超出窗口.

我可以在这里使用SQL内置的东西吗?

tpd*_*pdi 5

将"X"值更新为"pending".

完成操作A后,将"待处理"更新为任何内容.

无需锁定.