我想锁定MariaDb表中的某一行以进行多次更新,并希望在我完成更新后释放锁定。场景是多台机器可能正在请求锁定。当一台机器获得锁定时,它有一批需要多次更新行数据的工作。当第一台机器仍在忙于其一批工作时,另一台机器可能无法锁定。因此,如果第一台机器进行两次更新,则另一台机器可能无法获得两次更新之间的锁定。
我查看了事务,但是如果我的应用程序崩溃,它们会进行回滚,而我希望保留更新。
有没有人知道如何解决这类问题?谷歌搜索它不会产生任何好的命中,或者我的搜索条件可能是错误的。
修改:
试图更多地澄清用例:
此功能用于分布式系统中的事件处理,其中存在多个并发使用者。
事件是流的一部分,流中的事件必须按正确的顺序处理,否则系统会损坏。
由于各种原因,单个流的事件最终会出现在不同的消费者,错误的订单,大的延迟等等,这些都是例外情况,而不是正常的操作条件。
锁定行有助于确保不同的消费者不会同时处理同一个事件流
BEGIN;
SELECT counter, someAdditionalFields FROM streamCounters WHERE streamId=x FOR UPDATE;
# this locks the stream to this consumer
# This thread is processing event with eventId counter+1, this can be in the range of 0ms to a few seconds, certainly not minutes.
# The result of this work ends up in another table
UPDATE streamCounters SET counter=(counter+1) WHERE streamId=x;
# signifies that event was processed, the stream advances by 1
# This thread is processing event with eventId counter+2
UPDATE streamCounters SET counter=(counter+2) WHERE streamId=x;
# signifies that event was processed, the stream advances by 1
# ... until no more ready events available in stream
COMMIT; # release the lock on this stream
我不希望此事务在崩溃的情况下回滚的原因是因为事件的处理意味着其他表中的重大更改。 其他表中的更改是由应用程序的不同部分完成的,它们为我提供了一个我调用的函数,它们所做的并不是我实际控制的。
假设我想在流中处理事件1,我会锁定流。 我调用处理事件1的提供函数。 当它成功返回时,我将streamcounter从0更新为1 现在我想处理事件2,但是我崩溃了。 现在这个事务被回滚,streamcounter回到0,但是事件被处理了。 我的流程计算器现在不能代表完成了多少工作!