2012-04-12 18 views
11

Tengo una pregunta sobre el bloqueo optimista en Hibernate. Estoy intentando adentrarme en el bloqueo optimista con Hibernate, pero tengo una duda. Hibernate usa un enfoque de versión (entero o sello de tiempo) para implementar el bloqueo optimista. Para configurarlo, puede usar la anotación @Version (o la configuración xml) y crear un atributo de versión. La otra opción es configurar sin versiones usando el atributo optimistic-lock = "all".Bloqueo optimista en Hibernate de forma predeterminada

Mi pregunta es en caso de que no defina ningún atributo de control de versiones y tampoco especifique un atributo de bloqueo optimista, ¿qué estrategia utiliza Hibernate en estos casos? Pessimistc Locking Estoy bastante seguro de que no, así que supongo que es un bloqueo optimista, pero no sé cómo.

Muchas gracias por su atención.

Respuesta

33

Si no configura Hibernate para utilizar el bloqueo optimista, no utiliza ningún bloqueo. Entonces, en este caso, la última actualización siempre gana.

Para que quede claro, tenga en cuenta que el bloqueo optimista de Hibernate es completamente diferente del aislamiento de transacciones DBMS. El bloqueo optimista de Hibernate solo funciona en una situación en la que carga un objeto en una transacción, lo modifica y lo guarda más adelante en otra transacción. En este caso, el bloqueo optimista garantiza que alguna otra transacción no haya cambiado ese objeto en la base de datos en el medio. Sin embargo, el bloqueo optimista no afecta el aislamiento de las transacciones simultáneas, por lo tanto, los bloqueos (optimistas o pesimistas) utilizados internamente por DBMS para implementar el aislamiento de transacciones aún funcionan, independientemente de si el bloqueo de Hibernate está habilitado o no.

3

@axtavt, tiene razón, pero la pregunta acerca de cómo hibernate implementar el bloqueo optimista sin @Version columna.

Hoy cuatro opciones disponibles: OptimisticLockType

/** 
* Perform no optimistic locking. 
*/ 
NONE, 
/** 
* Perform optimistic locking using a dedicated version column. 
* 
* @see javax.persistence.Version 
*/ 
VERSION, 
/** 
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
DIRTY, 
/** 
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
ALL 

creo que esto es suficiente para responder a la pregunta original.

Cuestiones relacionadas