2010-12-04 56 views
13

Si tengo código que tiene el siguiente aspecto:Hibernate y las transacciones y la tabla de bloqueo

beginTransaction(); 
// lots of stuff happens, can take anywhere from a minute to several minutes. 
// it will read from several tables via calling getter methods on lazy relationships. 
commitTransaction(); 

Entre el inicio y confirmación, son las tablas que se están leyendo se bloquee y posteriormente lo hará esta causa problemas en un entorno multiusuario donde se producirán problemas cuando otro usuario llame al mismo código anterior.

Si lo anterior es problemático, ¿deberíamos siempre tratar de mantener las transacciones cortas? y para facilitar esto, en lugar de llamar a los métodos getter sobre las relaciones perezosas, ¿eso significa que es mejor mantener las transacciones cortas y hacer los hallazgos manualmente para los hijos de los padres?

Respuesta

18

Hibernate no hará nada para bloquear explícitamente las tablas que lees. La respuesta realmente depende de qué base de datos esté utilizando y de los niveles de aislamiento que tenga configurados. Bloquear una tabla completa leyendo las filas no debe aparecer en ninguna base de datos completa escrita en este siglo. Para cualquier base de datos multiversioning, nada se bloqueará a menos que usted bloquee explícitamente la fila.

Sus transacciones deben ser de la longitud que necesiten para su unidad de trabajo atómica. No hay longitud correcta o incorrecta. Pregúntese: "¿todo lo que sucede aquí tiene éxito o falla como una sola unidad y todos se vuelven a juntar si falla una pieza?" Ese es el alcance para el que establece una transacción.

Recuerde, no necesita una transacción para tener una carga diferida. Solo necesitas una sesión abierta. Los dos no están vinculados. Puede confirmar su transacción y mantener su sesión abierta para que funcione la carga lenta.

4

Lo mejor es mantener las transacciones cortas. Sin embargo, la semántica de bloqueo depende de los niveles de aislamiento de la transacción.

Open Session In View es el patrón que está buscando cuando habla de relaciones flojas.

Cuestiones relacionadas