Rails`with_lock`阻止读取吗?

jay*_*jay 9 postgresql locking ruby-on-rails

假设我有一个Article我想要执行一些更改.

如果我使用with_lock,是否会阻止其他进程读取Articles表中的那一行?

例如

 @article = Article.find(1)
 Article.with_lock
   #do something
 end

 # In another process
 @article = Article.find(1) # will this lookup be blocked by the first process?
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 17

根据文档,它SELECT ... FOR UPDATE默认执行.

一个SELECT ... FOR UPDATE在某行并不能读取该行阻止其他会话.它仅阻止其他会话获取行上的FOR UPDATE(写入)或FOR SHARE(读取)锁定.对于SELECT没有任何FOR UPDATEor FOR SHARE子句的会话,该行通常仍然可读.

所以在这种情况下,你需要find行,然后lock('FOR SHARE')如果你想确定没有其他人FOR UPDATE对它进行锁定就可以执行.

有关更多详细信息,请参阅有关显式锁定的PostgreSQL文档.