我在模型类中有一个函数,在该函数内,我有以下代码:
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,这意味着sqlSELECT .. 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 ...
并且该锁将在选择查询完成后被释放。