Rails 中对象的锁何时被释放?

问题描述 投票:0回答:2

我在模型类中有一个函数,在该函数内,我有以下代码:

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

那么,在上面的情况下,什么时候会释放对象的锁呢?

注意:我没有将此代码包装在事务块中。

ruby-on-rails rails-activerecord
2个回答
4
投票

ActiveRecord::Locking::Pessimistic 被设计为与事务一起使用,这意味着

lock!
应该在事务内部调用,并且当事务提交或回滚时锁将被释放。

您还可以使用

with_lock do ... end
创建交易并自动锁定字段。


1
投票

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 ...

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

© www.soinside.com 2019 - 2024. All rights reserved.