乐观锁以nil开头?

Optimistic Locking starts with nil?

让我先说 rails 乐观锁定的行为似乎有效,我只是想了解为什么我的单元测试返回的值是它的值。当 运行 我的单元测试时,检查 lock_version 是否递增,而 assert_not_equal 我通过了测试。当我将测试设置为 assert_equal 时,它失败了,但是消息 returns nil 而不是 0。为什么?

lock_version详情 Data_type => Number(38,0), Nullable => No, Data_default => 0

单元测试

  test "optimistic locking increments" do
    invoice = create(:invoice)
    first  = Invoice.find(invoice.invoice_id)
    second = Invoice.find(invoice.invoice_id)
    first.currency  = "GBP"
    second.currency = "EUR"
    first.save
    second.save
    assert_equal first.lock_version, second.lock_version 
  end

Expected: nil Actual: 1

更新

当我将测试更改为 assert_not second.save 时,它失败了。我的理解是乐观锁定应该防止保存(更新)第二个值。为什么不是呢?

根据 Kristján 的建议 first.lock_version returns "",不是 0

当我生成 lock_version 列时,我使用了以下迁移。

class AddLockVersionToInvoice < ActiveRecord::Migration
  def change
    add_column :ch_invoice, :lock_version, :integer, default: 0, null: false
  end
end

gems

ruby-oci8 (2.2.1) activerecord-oracle_enhanced-adapter (1.6.7, 1.6.6)

这个组合不知何故不起作用。删除 null:false 并在数据库中重新创建对象确实修复了它。不确定这是否是已知错误,但我的一位同事将有机会与从事增强型适配器工作的人交谈 gem,看看我们是否可以获得更多见解。

通过上述更改,乐观锁定行为正在发挥作用。 N.B。我原先使用的migration来源于这个railscast.