sql >> Base de Datos >  >> RDS >> Oracle

Manejo de actualizaciones simultáneas en hibernación

¿Alguien puede explicarme si usamos Spring para la gestión de transacciones, cómo Hibernate manejará las actualizaciones simultáneas (gestión automática de versiones en memoria de Hibernate) o si tengo que poner la columna de versión en la base de datos para encargarme de las actualizaciones simultáneas manualmente? P>

Ya sea que esté utilizando Spring para la gestión de transacciones o no, realmente no importa y no es relevante cuando se trata de la gestión de concurrencia, en realidad Hibernate se encarga de esto. Hibernate puede usar 2 estrategias para manejar actualizaciones simultáneas:bloqueo optimista y bloqueo pesimista.

Optimista

Cuando usa el bloqueo optimista, asigna un atributo especial (un número, una marca de tiempo) como una versión (así que en realidad tienes una columna para ello). Esta versión se lee cuando recupera una entidad y se incluye en la cláusula where durante una actualización y incrementado por Hibernate.

Para ilustrar cómo funciona esto, imaginemos que carga una entidad Person por id=1 y con una versión actual=1. Después de guardar, Hibernate realizará algo como esto:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Entonces, ahora, imagine que tiene dos transacciones simultáneas en ejecución, cada una de ellas cargando el mismo entidad (mismo número de versión) y cambiando el nombre.

Digamos que la transacción #1 se confirma primero, se realiza la siguiente consulta:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Tiene éxito y la versión se incrementa.

Luego se confirma la transacción #2, se realiza la siguiente consulta:

update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;

Este no actualizará nada porque la cláusula where no coincidirá con ningún registro. Aquí es donde obtendrá una excepción de concurrencia optimista.

Esta estrategia es adecuada cuando no se mantiene la conexión, cuando los accesos simultáneos no son frecuentes y escala muy bien. Y, por supuesto, Hibernate maneja todo de manera transparente para usted, siempre que asigne un atributo de versión.

Pesimista

Al usar el bloqueo pesimista, Hibernate bloquea un registro para su uso exclusivo hasta que haya terminado con él (generalmente usando un SELECT ... FOR UPDATE ). Cualquier otra transacción simultánea que intente acceder al mismo registro se suspenderá hasta que se elimine el bloqueo. Esta estrategia brinda una mejor previsibilidad, a costa del rendimiento y no se escala indefinidamente.

Referencias

  • Guía de referencia del núcleo de Hibernate
    • 11.3. Control de concurrencia optimista
    • 11.4. Bloqueo pesimista