如何锁定一行,并在多个事务中使用锁?
How can I lock a row, and use the lock across multiple transactions?
我有一种情况需要:
- 读取一行的值。
- 如果某列的值为'X',执行操作A。否则,执行操作B。
- 如果我们执行了操作 A,则使用操作结果更新该列。
Action A不是数据库操作,可能需要一段时间运行,且不可逆。 Action B 不是数据库操作,但是速度很快运行。该序列在多个服务器上的多个线程上执行。
目前我们没有锁定,所以偶尔我们会看到操作 A 被执行多次,而实际上它应该只发生一次。我认为我唯一的解决方案是以某种方式用 acquire lock 步骤和 release lock 步骤包装上面的序列,我不确定怎么做。
我看过 a similar question,答案是向该行添加 'locked' 和 'acquiry time' 列。但是,在那种情况下,OP 并不担心频繁重新获取锁。如果我每次想执行序列时都必须旋转等待前一个锁过期,我的服务器性能可能会超出 window.
SQL 是否有我可以在这里使用的内置功能?
将 "X" 值更新为 "pending"。
完成操作 A 后,将 "pending" 更新为任意值。
不需要锁定。
我有一种情况需要:
- 读取一行的值。
- 如果某列的值为'X',执行操作A。否则,执行操作B。
- 如果我们执行了操作 A,则使用操作结果更新该列。
Action A不是数据库操作,可能需要一段时间运行,且不可逆。 Action B 不是数据库操作,但是速度很快运行。该序列在多个服务器上的多个线程上执行。
目前我们没有锁定,所以偶尔我们会看到操作 A 被执行多次,而实际上它应该只发生一次。我认为我唯一的解决方案是以某种方式用 acquire lock 步骤和 release lock 步骤包装上面的序列,我不确定怎么做。
我看过 a similar question,答案是向该行添加 'locked' 和 'acquiry time' 列。但是,在那种情况下,OP 并不担心频繁重新获取锁。如果我每次想执行序列时都必须旋转等待前一个锁过期,我的服务器性能可能会超出 window.
SQL 是否有我可以在这里使用的内置功能?
将 "X" 值更新为 "pending"。
完成操作 A 后,将 "pending" 更新为任意值。
不需要锁定。