2017-06-20 44 views
0

我有我需要的情况:如何锁定一行,并在多个交易中使用锁定?

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

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

目前我们没有锁定,所以偶尔我们会看到动作A被多次执行,当它只发生一次时。我认为我的唯一解决方案是以某种方式将上面的序列打包成获取锁步骤和版本锁步骤,我不知道该怎么做。

我看过a similar question,答案是在行上添加'locked'和'acquiry time'列。但是,在这种情况下,业主不担心频繁重新获得锁定。如果每次我想执行序列时都必须旋转等待前一个锁过期,我的服务器的性能可能会超出窗口。

是否有内置的SQL,我可以在这里使用?

回答

5

将“X”值更新为“挂起”。

完成操作A后,更新“挂起”为任何内容。

无需锁定。

+0

哦哇,经典的X Y问题。我甚至没有想到这一点。 –

+0

这是否仍然有可能两个线程同时查询该行,并且这两个线程都将该行视为“X”,并且都尝试将其更新为挂起? –

+0

@AndrewWilliamson:如果你选择了中间层,然后进行更新。但是如果你只是做了更新,那应该是原子的(除非你玩SET ISOLATION_LEVEL游戏)。 – tpdi