据我了解,这是一个结果Mysql内部保护 - 您正在查询数据库,并流式传输结果,如果在此期间您还将更新结果,您不能保证任何级别的一致性。
如果您知道可以安全地在流程中进行更改,则可以通过简单地创建第二个连接来解决这个问题:
reading_client = Mysql2::Client.new(:host => 'localhost', :database => 'mehdb', :username => "root", :password => "", :flags => Mysql2::Client::MULTI_STATEMENTS)
updating_client = Mysql2::Client.new(:host => 'localhost', :database => 'mehdb', :username => "root", :password => "", :flags => Mysql2::Client::MULTI_STATEMENTS)
sql = "SELECT id, x FROM pew WHERE x IS NULL LIMIT 1000"
results = reading_client.query(sql)
while results.count > 0
updates = ''
results.each do |r|
updates += "UPDATE pew SET x = 10 WHERE id = #{r['id']};"
end
updating_client.query(updates) unless updates.empty?
results = reading_client.query(sql)
end