我有一个 Datamapper 模型,比如 XYZ。现在,有多个线程有时会使用此模型读取一行并尝试更新同一行 - 只有一个应该成功,具体取决于 XYZ 的属性,比如 abc
class XYZ
include DataMapper::Resource
property :id # primary key
property :abc
end
现在:
obj = XYZ.get(some_id)
obj.update(abc: 10) # Assume abc column value was 5 earlier
这可能发生在多个线程中,也可能同时发生。此外,列 abc
的新值在每个线程中都是不同的。曾经,当一个线程更新 abc
时,其他线程不应该更新。本质上,我要做的是通过数据映射器运行此查询:
UPDATE `xyz` SET `abc` = 20 WHERE `id` = <some id> AND `abc` = 5
model.update
函数不允许同时更新属性和设置该属性的条件。我知道我可以直接运行 SQL 查询;但是还有其他办法吗?
我会做这样的事情:
XYZ.all( :id => some_id, :abc => 5 ).update( :abc => 20 )
我是一名优秀的程序员,十分优秀!