不知何故,我总是在周五收到这些。
我之前的问题是关于同样的问题,但我现在可以缩小范围:
我一整天都在研究这个问题,试图理解它。我有一个带有 lock_version 列的表,如此指定:
add_column :jobs, :lock_version, :integer, :default=>0
我做了这样的事情:
foo = job.create!
first = Job.find(foo.id)
second = Job.find(foo.id)
然后我验证第一个和第二个引用同一个对象 - 它们的 id 相同,并且我使用 mysql 命令行工具在数据库中看到该行。
first.some_attribute_field = 'first'
second.some_attribute_field = 'second'
first.save
second.save
到目前为止没有问题。我正确地得到了 ActiveRecord::StaleObjectError 异常。 但是:
first = Job.find(foo.id)
second = Job.find(foo.id)
first.some_attribute_field = 'first'
second.some_attribute_field = 'second'
first.save
second.save
...什么也没有发生。事实证明,我获得正确(抛出异常)行为的唯一一次是当第一个和第二个的 lock_version 为 0 时。但是,在第一次保存之后,它再也不会为 0。这到底是怎么回事?
我使用的是 ruby 1.8.6 和 active record 2.2.2
谢谢...
最佳答案
当您第二次调用first.save时,some_attribute_field的值已经等于“first”,activerecord知道这一点,因此它不会在数据库中更新到lock_version不会增加。第二次保存有效,因为数据库从未随“第一次”更改。
尝试将第二个测试中的值更改为“first”以外的值,以便它与数据库中的值不同。
关于activerecord - 为什么 activerecord 乐观锁定每行只工作一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/813535/