当锁定在轨道中的对象上释放时?

问题描述

我在模型类中有一个函数,在该函数中我是这样做的,

def myfun
  .... 
  self.lock!
  self.name = "hi" 
  .... 
  .... 
 end

那么上面的例子什么时候会从对象中释放锁?

这里注意:我不是在事务块中写这个。

解决方法

ActiveRecord::Locking::Pessimistic 用于事务,这意味着 lock! 应在事务内部调用,并在事务提交或回滚时释放锁。

您也可以使用 with_lock do ... end 创建交易并自动锁定字段。

,

ActiceRecord#lock! 不会像您想象的那样锁定任何 object,它会调用 reload(lock: true),后者附加在 SELECT 语句的末尾或为“FOR UPDATE”传递 true,这意味着sql SELECT .. FOR UPDATE 将被调用,以便创建一个数据库锁(排他行锁?,取决于数据库),返回一个锁定的记录,这就是 lock! 暗示的,不锁定对象。

q = Question.first 
# SELECT "questions".* FROM "questions" ORDER BY "questions"."id" ASC LIMIT $1  ...
q.lock! 
# SELECT "questions".* FROM "questions" WHERE "questions"."id" = $1 LIMIT $2 FOR UPDATE ...

在选择查询完成后,该锁将被释放。