问题描述
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 ...
在选择查询完成后,该锁将被释放。