我一直在努力将记录级锁定放在我的桌子上,以避免在更新记录时出现任何脏读和争用情况。 我使用的是ruby 2.1.3和rails 3.2.13。我尝试使用命令:
Account.connection.execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")
并通过置入睡眠进行测试,但是尝试更新同一记录的2个进程读取旧值并且最终数据是错误的。例如:如果我的旧值为100,则两个进程都读取100然后更新,100 + x和100 + y,因此数据已损坏。
我正在使用mySQL数据库。任何帮助表示赞赏。
答案 0 :(得分:0)
以下解决方案对我有用(略微修改dimakura的答案):
当我使用find()进行活动记录查询时:
acc = Account.lock.find(id)
acc.balance += 100
acc.save!
当我使用where()进行活动记录查询时:
acc = Account.where(:acc_code => acc_code).first
acc.with_lock do
acc.balance += 100
acc.save!
end