activerecord - 为什么 activerecord 乐观锁定每行只工作一次?

标签 activerecord locking optimistic-locking optimistic

不知何故,我总是在周五收到这些。

我之前的问题是关于同样的问题,但我现在可以缩小范围:

我一整天都在研究这个问题,试图理解它。我有一个带有 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/

相关文章:

java - 如何让其他线程等待给定的任务结果

java - Java中的多锁单解锁?

java - JPA 中乐观锁定的表索引/pk

sql-server-2008 - 锁定用户记录并防止编辑?

mysql - Rails 独特的约束模型 + 数据库级别和竞争条件

mysql - Rails 事件记录 : How to join three tables?

sql-server - SQL Server - 是否有名为 'dirty write' 的东西?

optimistic-locking - 乐观锁乐观并发控制

ruby - Hstore 和 Rails

mysql - Yii2 find-all + hasone