risposta

2

Quando si utilizza counter_cache, l'inserto di record e l'aggiornamento del contatore sono fatte nella stessa transazione. Ma questo non garantisce l'atomicità di un'operazione. Potrebbe essere necessario "bloccare" il record oltre a evitare il problema di aggiornamento di due persone.

Vedere this excellent article. Si tratta della gemma degli oggetti redis ma le prime due parti spiegano perfettamente il problema e la soluzione con ActiveRecord.

1

Risposta breve: no. Come menziona Cédric, Rails aggiorna lo counter_cache all'interno di una transazione, quindi se si dice che si ha un processo in background che aggiorna lo stesso record, si troveranno errori deadlock a meno che non si eseguano entrambi gli aggiornamenti utilizzando un blocco with_lock nel record.