Frage Wird Rails `with_lock` Block gelesen?


Angenommen, ich habe eine Article dass ich einige Änderungen vornehmen möchte.

Wenn ich benutze with_lock, wird es andere Prozesse davon abhalten, diese Zeile in der Articles Tabelle?

Z.B.

 @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?

8
2017-09-23 00:00


Ursprung


Antworten:


Pro die Dokumentationmacht es a SELECT ... FOR UPDATE standardmäßig.

EIN SELECT ... FOR UPDATE in einer Reihe tut nicht Blockieren Sie andere Sitzungen vom Lesen der Zeile. Es blockiert nur andere Sitzungen von einem erhalten FOR UPDATE (schreiben oder FOR SHARE (lesen) sperren Sie die Zeile. Die Zeile bleibt normalerweise für Sitzungen lesbar, die a ausführen SELECT ohne irgendetwas FOR UPDATE oder FOR SHARE Klausel.

In diesem Fall müssten Sie das tun find die Reihe, dann mach ein lock('FOR SHARE') darauf, wenn du sicher sein wolltest, dass niemand sonst eine hat FOR UPDATE verriegeln Sie es.

Für mehr Details siehe die PostgreSQL-Dokumentation zum expliziten Sperren.


15
2017-09-23 00:56