微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决当锁定在轨道中的对象上释放时?

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。