2014-09-23 3 views
6

Supponiamo di avere un Article su cui voglio eseguire alcune modifiche.Si legge il blocco `with_lock` di Rails?

Se uso with_lock, si blocca altri processi di leggere quella riga nella tabella Articles?

E.g.

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

risposta

11

Per the documentation, si fa un SELECT ... FOR UPDATE per impostazione predefinita.

A SELECT ... FOR UPDATE su una riga fa non bloccare altre sessioni dalla lettura della riga. Blocca solo altre sessioni dall'ottenere un blocco FOR UPDATE (scrittura) o FOR SHARE (lettura) sulla riga. La riga rimane normalmente leggibile per le sessioni che eseguono un SELECT senza alcuna clausola FOR UPDATE o FOR SHARE.

Quindi, in questo caso, avresti bisogno di find fila, poi fare un lock('FOR SHARE') su di esso, se si voleva essere sicuro che nessuno altro aveva una serratura FOR UPDATE su di esso.

Per ulteriori dettagli, vedere the PostgreSQL documentation on explicit locking.