Solución:
Tanto el aislamiento de transacciones como el bloqueo de entidades JPA son mecanismos de control de concurrencia.
El aislamiento de transacciones se aplica en un nivel de conexión JDBC y el alcance es el ciclo de vida de la transacción en sí (no puede cambiar el aislamiento de transacciones de sus transacciones en ejecución actuales). Las bases de datos modernas le permiten utilizar niveles de aislamiento 2PL (bloqueo de dos fases) y MVCC (niveles de aislamiento SNAPSHOT_ISOLATION o PostgreSQL). En MVCC, los lectores no bloquean a los escritores y los escritores no bloquean a los lectores (solo los escritores bloquean a los escritores).
La API de bloqueo de persistencia de Java ofrece control de concurrencia a nivel de base de datos y de aplicación, que se puede dividir en dos categorías:
-
Modos de bloqueo optimistas explícitos:
- OPTIMISTA
- OPTIMISTIC_FORCE_INCREMENT
- PESSIMISTIC_FORCE_INCREMENT
El bloqueo optimista utiliza verificaciones de versión en las declaraciones UPDATE / DELETE y falla en las discrepancias de versión.
-
Modos de bloqueo pesimistas explícitos:
- PESSIMISTIC_READ
- PESSIMISTIC_WRITE
Los modos de bloqueo pesimistas utilizan una sintaxis de bloqueo específica de la base de datos para adquirir bloqueos de lectura (compartidos) o de escritura (exclusivos) (por ejemplo, SELECT … FOR UPDATE).
Un modo de bloqueo explícito es adecuado cuando se ejecuta en un nivel de aislamiento de consistencia inferior (READ_COMMITTED) y desea adquirir bloqueos cuyo alcance se actualiza de la vida útil de la consulta a la vida útil de la transacción.
Introducción
Existen diferentes tipos de bloqueo y niveles de aislamiento. Algunos de los tipos de bloqueo (OPTIMISTIC *) se implementan en el nivel JPA (por ejemplo, en EclipseLink o Hibernate), y otros (PESSIMISTIC *) son delegados por el proveedor JPA al nivel DB.
Explicación
Los niveles de aislamiento y bloqueo no son lo mismo, pero pueden cruzarse en alguna parte. Si tiene el nivel de aislamiento SERIALIZED (que es codicioso en el rendimiento), entonces no necesita ningún bloqueo en JPA, como ya lo hace la base de datos. Por otro lado, si elige READ_COMMITTED, es posible que deba realizar un bloqueo, ya que el nivel de aislamiento por sí solo no le garantizará, por ejemplo, que la entrada no se modifique mientras tanto por otra transacción.