操作が必要な行のリストを持つデータベースがあります。次のようになります。
id remaining delivered locked
============================================
1 10 24 f
2 6 0 f
3 0 14 f
私はRubyでDataMapperを使用していますが、実際には、これは私が使用している正確な実装に固有のものではない一般的なプログラミングの質問だと思います...
次のようなことを行う一連のワーカー スレッドを作成しています (疑似ルビー コード):
while true do
t = any_row_in_database_where_remaining_greater_than_zero_and_unlocked
t.lock # update database to set locked = true
t.do_some_stuff
t.delivered += 1
t.remaining -= 1
t.unlock
end
もちろん、問題は、これらのスレッドが互いに競合し、全体が実際にはスレッド セーフではないことです。while ループの最初の行は、ロックされる機会を得る前に、複数のスレッドで同じ行を簡単に引き出すことができます。
1 つのスレッドが同時に 1 つの行でのみ動作していることを確認する必要があります。
これを行う最善の方法は何ですか?