Mysql 如何在Datamapper的更新查询中添加WHERE子句

Mysql 如何在Datamapper的更新查询中添加WHERE子句,mysql,ruby,multithreading,datamapper,ruby-datamapper,Mysql,Ruby,Multithreading,Datamapper,Ruby Datamapper,我有一个数据映射器模型,比如XYZ。现在,有多个线程有时使用此模型读取一行并尝试更新同一行-根据XYZ的属性(例如abc),应该只有一个线程会成功 class XYZ include DataMapper::Resource property :id # primary key property :abc end 现在: 这可能发生在多个线程中,也可能同时发生。此外,列abc的新值在每个线程中都不同。一次,当一个线程更新abcabc时,其他线程不应该更新。基本上,我尝试通过datamapper

我有一个数据映射器模型,比如XYZ。现在,有多个线程有时使用此模型读取一行并尝试更新同一行-根据XYZ的属性(例如abc),应该只有一个线程会成功

class XYZ
include DataMapper::Resource
property :id # primary key
property :abc
end
现在:

这可能发生在多个线程中,也可能同时发生。此外,列
abc
的新值在每个线程中都不同。一次,当一个线程更新abc
abc
时,其他线程不应该更新。基本上,我尝试通过datamapper运行此查询:

UPDATE `xyz` SET `abc` = 20 WHERE `id` = <some id> AND `abc` = 5
UPDATE`xyz`SET`abc`=20,其中`id`=和`abc`=5

model.update
函数不允许同时更新属性和该属性的条件。我知道我可以直接运行SQL查询;但是还有别的办法吗?

我会这样做:

XYZ.all( :id => some_id, :abc => 5 ).update( :abc => 20 )

这将导致两个db查询—一个是
选择
,然后是
更新
。我试图解决的问题是并发性——所有线程在同一时间读取相同的数据,然后几乎立即尝试更新它(是的,我知道这应该是一个竞争条件,但它正在发生)。我想在SQL查询本身中设置一个条件,以便在所有情况下都能解决并发性问题。啊,我的错,我已经习惯了Sequel,这种构造将有一个查询。这在DataMapper中也是可能的,将有一个thinkNot答案,但我发现这对确认DataMapper正在做什么很有用:是的,我可以看到所有的DM查询(使用Padrino framework logger和DM)。我仔细阅读了DM代码,最后屈服于本机SQL查询:(不过感谢您的回答。。。。
XYZ.all( :id => some_id, :abc => 5 ).update( :abc => 20 )