2010-07-27 22 views
8

Estaba leyendo el siguiente blog sobre el bloqueo optimista de hibernación. Estoy planeando usarlo con Hibernate. Pero, tengo una preocupación. tenemos código java y código C++, ambos conectamos a una base de datos. Mientras que el código Java puede usar hibernate para lograr un bloqueo optimista, quiero que el código C++ haga lo mismo. Además, el código C++ está usando algún código heredado.Hibernate optimistic locking..how it works?

http://turgaykivrak.wordpress.com/2009/05/16/72/

¿Hay una documentación que explica cómo hibernación logra el bloqueo optimista?

Cualquier sugerencia es apreciada.

Gracias
Bala

Respuesta

11

Para ser precisos, que no quieres decir el bloqueo optimista, pero la concurrencia optimista (sin bloqueo). Usar una marca de tiempo para la versión es solo para el soporte de base de datos heredado, porque una base de datos moderna puede (al menos teóricamente) funcionar más rápido que la precisión de almacenar una marca de tiempo.

Mediante la propiedad de la versión número entero es muy simple:

  • en Insertar: Versión establecido en 1
  • En actualizar y borrar: aumento versión con 1 y anexar "donde version = @ versión" a cada sql statementent. Devuelve la cantidad de registros modificados. Lanza una StaleObjectStateException cuando la cantidad de registros modificados es diferente de lo esperado.

Personalmente, no crearía dos aplicaciones distintas escribiendo los mismos datos en una situación no heredada, porque eso significa que la lógica empresarial debe duplicarse y los cambios deben aplicarse a dos aplicaciones, también cuando el cambio es relevante solo para una de las aplicaciones.

+0

Gracias @Paco. ¿Puedo usar un bigint en lugar de enteros en mysql? – Boolean

+1

Esto es correcto para MySQL, de eso se trata la pregunta, pero TimeStamp es preferible si está usando SQL Server. Ver también http://ayende.com/Blog/archive/2009/04/15/nhibernate-mapping-concurrency.aspx. –

+0

No tengo experiencia con la propiedad de versión NHibernate combinada con mysql. Supongo que puede asignar mysql bigint a java long especificando el tipo de longitud en el mapeo de propiedades de la versión. – Paco