2011-08-26 32 views
8

De acuerdo con Java Persistent/Locking wikibooks *, la mejor manera de manejar bloqueos es informar al usuario sobre el error/excepción de bloqueo optimista.¿Cómo lidiar con bloqueos (JPA)?

El problema es que no es escalable. Supongamos que tengo muchos usuarios que pueden causar un bloqueo con la misma acción. Al usuario no le importa el mensaje de error de bloqueo.

En pocas palabras:

  • La mejor manera es desactivar todos los bloqueos?
  • ¿La mejor manera es informar al usuario del mensaje de bloqueo de error? ¡Pero el usuario debe volver a intentar su acción hasta que funcione!
  • ¿La mejor manera es reintentar la transacción hasta que no haya bloqueo?

*

manejo de excepciones bloqueo optimista

Desafortunadamente programadores con frecuencia pueden ser demasiado inteligente para su propio bien. El primer problema que surge al utilizar el bloqueo optimista es qué hacer cuando ocurre una OptimisticLockException. La respuesta típica del súper programador de vecindario amigable es manejar automáticamente la excepción. Simplemente crearán una nueva transacción, actualizarán el objeto para restablecer su versión, y fusionarán los datos nuevamente en el objeto y lo volverán a comprometer. Problema de Presto resuelto, o es?

En realidad, esto frustra el punto de bloqueo total. Si esto es lo que deseas, también puedes usar ningún bloqueo. Desafortunadamente, la OptimisticLockException rara vez se debe manejar automáticamente, y realmente debe molestar al usuario sobre el problema. Debe informar el conflicto al usuario y decir "lo siento, pero se produjo un conflicto de edición y van a tener que volver a hacer su trabajo", o en el mejor de los casos, actualizar el objeto y presentar al usuario los datos actuales y los datos que presentaron y ayudarlos a fusionar los dos si corresponde.

Algunas herramientas de combinación automatizadas compararán las dos versiones en conflicto de los datos y si ninguno de los campos individuales entran en conflicto, los datos se fusionarán automáticamente sin la ayuda del usuario. Esto es lo que hacen la mayoría de los sistemas de control de versiones de software. Lamentablemente, el usuario suele ser más capaz de decidir cuándo algo es un conflicto que el programa, simplemente porque dos versiones del archivo .java no cambiaron la misma línea de código no significa que no hubo conflicto, el primer usuario podría haber eliminado un método que el otro usuario agregó un método de referencia, y varios otros posibles problemas que hacen que la construcción típicamente nocturna se rompa cada cierto tiempo.

+0

posible duplicado de [¿Cómo deshabilitar el sistema de bloqueo de JPA?] (Http://stackoverflow.com/questions/7201940/how-to-disable-the-lock-system-of-jpa), del mismo autor. –

+2

Diría que no están duplicados, porque uno pregunta cómo deshabilitar, y el otro pregunta por la estrategia con bloqueos. – edutesoy

Respuesta

10

El usuario se preocupará por el mensaje, porque quería hacer algunas modificaciones y las modificaciones no se han realizado. Así, actualizará la página para ver el nuevo estado de los datos, y volverá a hacer sus modificaciones, o decidirá que ya no deberían hacerse dado el nuevo estado.

¿Es un problema si dos usuarios modifican una entidad al mismo tiempo, y si la última modificación gana, cualquiera que sea la modificación? Si es un problema, utilice un bloqueo optimista e informe a su usuario cuando haya un problema. No hay forma de evitarlo.

Si no es un problema, entonces no use un bloqueo optimista. La última modificación, si no rompe las restricciones en su base de datos, siempre ganará.Pero tener usuarios simultáneos que modifiquen los mismos datos siempre dará lugar a excepciones (por ejemplo, porque algunos usuarios pueden eliminar una entidad antes de que otro usuario envíe una modificación a la misma entidad).

Reintentando no es una opción:

  • o bien se producirá un error de nuevo, porque simplemente no es posible hacer las modificaciones
  • o tendrá éxito, pero va a derrotar el punto de tener el bloqueo optimista en el primer lugar.

Su problema podría explicarse con una analogía de automóvil. Supongamos que elige comprar un automóvil con un limitador de velocidad, para asegurarse de no romper el límite de velocidad. Y ahora preguntas: pero no me importan los límites de velocidad. ¿No debería siempre desactivar el limitador de velocidad? Puedes, pero no te sorprendas si te atrapa la policía.

+0

Gracias por su gran explicación –

Cuestiones relacionadas