我有一个数据库,其中包含需要操作的行列表。它看起来像这样:
id remaining delivered locked
============================================
1 10 24 f
2 6 0 f
3 0 14 f
我正在将 DataMapper 与 Ruby 一起使用,但实际上我认为这是一个一般性的编程问题,并不特定于我正在使用的确切实现......
我正在创建一堆执行类似操作的工作线程(伪 ruby 代码):
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 循环中的第一行可以轻松地在多个线程中拉出同一行,然后才有机会被锁定。
我需要确保一个线程同时只在一行上工作。
做这个的最好方式是什么?