De la documentación para find_or_create
:Cómo evitar las condiciones de carrera cuando se usa el método find_or_create de DBIx :: Class :: ResultSet?
Nota: Debido a find_or_create() lee de la base de datos y luego posiblemente insertos en base al resultado, este método está sujeto a una condición de carrera . Otro proceso podría crear un registro en la tabla después de el hallazgo se ha completado y antes de que la creación haya comenzado. Para evitar este problema, use find_or_create() dentro de una transacción.
¿Es suficiente simplemente usar find_or_create()
dentro de una transacción en PostgreSQL?
Otras páginas útiles. Documentos: http://www.postgresql.org/docs/current/interactive/mvcc.html Implementación serializable de PostgreSQL versión 9.1 o posterior: http://wiki.postgresql.org/wiki/SSI Otros niveles de aislamiento o versiones de PostgreSQL: http : //www.postgresql.org/files/developer/concurrency.pdf – kgrittn
¿Pero cuál es la forma correcta de detectar "el error de violación de clave duplicada" en DBIC? –
@eugeney: Supongo que abre una nueva pregunta para eso, en lugar de un comentario. Siempre puedes enlazar a este para ahorrarte algo de tipeo. –