Dalla documentazione per find_or_create
:Come evitare le condizioni di gara quando si utilizza il metodo find_or_create di DBIx :: Class :: ResultSet?
Nota: A causa find_or_create() legge dal database e poi, eventualmente, inserti in base al risultato, questo metodo è soggetto a una gara condizione. Un altro processo potrebbe creare un record nella tabella dopo la ricerca è stata completata e prima dell'avvio della creazione. Per evitare questo problema, utilizzare find_or_create() all'interno di una transazione.
E 'sufficiente utilizzare solo find_or_create()
all'interno di una transazione in PostgreSQL?
Altre pagine utili. Documenti: http://www.postgresql.org/docs/current/interactive/mvcc.html PostgreSQL versione 9.1 o successiva implementazione serializzabile: http://wiki.postgresql.org/wiki/SSI Altri livelli di isolamento o versioni di PostgreSQL: http : //www.postgresql.org/files/developer/concurrency.pdf – kgrittn
Ma qual è il modo corretto per rilevare "l'errore di violazione della chiave duplicata" in DBIC? –
@eugeney: Suppongo che tu apra una nuova domanda per questo, invece di un commento. Puoi sempre collegarti a questo per risparmiarti un po 'di digitazione. –