在ruby v 2.1.3中设置隔离级别

时间:2015-09-14 08:25:53

标签: ruby-on-rails activerecord isolation-level transaction-isolation

我一直在努力将记录级锁定放在我的桌子上,以避免在更新记录时出现任何脏读和争用情况。 我使用的是ruby 2.1.3和rails 3.2.13。我尝试使用命令:

Account.connection.execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")

并通过置入睡眠进行测试,但是尝试更新同一记录的2个进程读取旧值并且最终数据是错误的。例如:如果我的旧值为100,则两个进程都读取100然后更新,100 + x和100 + y,因此数据已损坏。

我正在使用mySQL数据库。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

以下解决方案对我有用(略微修改dimakura的答案):

  1. 当我使用find()进行活动记录查询时:

    acc = Account.lock.find(id)
    acc.balance += 100
    acc.save!
    
  2. 当我使用where()进行活动记录查询时:

    acc = Account.where(:acc_code => acc_code).first
    acc.with_lock do
     acc.balance += 100
     acc.save!
    end