java - ¿Por qué no se recomienda "hibernate.connection.autocommit=true" en Hibernate?
database transactions (4)
En la API de Hibernate, hay una propiedad hibernate.connection.autocommit que se puede establecer en true.
Pero en la API, han mencionado que no se recomienda configurarlo así:
Habilita la confirmación automática para conexiones agrupadas JDBC (no se recomienda).
¿Por qué no se recomienda? ¿Cuáles son los efectos negativos de establecer esta propiedad en true?
No use el antipatterno de sesión por operación: no abra ni cierre una sesión por cada simple llamada de base de datos en un solo hilo. Lo mismo es cierto para las transacciones de base de datos. Las llamadas de base de datos en una aplicación se realizan utilizando una secuencia planificada; Se agrupan en unidades atómicas de trabajo. Esto también significa que el auto-compromiso después de cada sentencia de SQL es inútil en una aplicación ya que este modo está destinado para el trabajo de la consola de SQL ad-hoc. Hibernar desactiva, o espera que el servidor de aplicaciones deshabilite, el modo de confirmación automática de inmediato. Las transacciones de base de datos nunca son opcionales. Toda comunicación con una base de datos tiene que ocurrir dentro de una transacción. Se debe evitar el comportamiento de autocompromiso para leer datos, ya que es poco probable que muchas transacciones pequeñas se desempeñen mejor que una unidad de trabajo claramente definida. Este último también es más mantenible y extensible.
Por defecto, el valor de confirmación automática es falso, por lo tanto, la transacción debe comprometerse explícitamente. Esta podría ser la razón por la que los cambios no se reflejan en la base de datos, de lo contrario, puede intentar vaciar para forzar los cambios antes de confirmar.
Cuando cierre la sesión, se comprometerá implícitamente en la base de datos [depende de la implementación].
Cuando tiene transacciones en cascada y necesita retroceder por atomicidad, necesita tener control sobre las transacciones y, en ese caso, la confirmación automática debe ser falsa.
Establezca autocommit como true o maneje las transacciones explícitamente.
Here hay una buena explicación al respecto.
Foro de hibernación relacionado con esto.
Pregunta de en él.
Según tengo entendido, si Hibernate se entrega automáticamente, entonces una descarga que falla parcialmente no se revertirá. Tendrás un gráfico de objeto incompleto / roto.
Si desea una conexión con la confirmación automática para algo, siempre puede desempaquetar una nueva Session
creada para obtener la conexión JDBC subyacente, setAutocommit(true)
, hacer su trabajo a través de las API de JDBC, setAutocommit(false)
y cerrar la sesión. No recomendaría hacer esto en una Session
que ya haya hecho algo.
Todas las declaraciones de la base de datos se ejecutan dentro del contexto de una transacción física, incluso cuando no declaramos explícitamente los límites de la transacción (BEGIN / COMMIT / ROLLBACK).
Si no declara los límites de la transacción, entonces cada declaración deberá ejecutarse en una transacción separada. Esto puede incluso llevar a abrir y cerrar una conexión por instrucción.
Declarar un servicio como @Transactional le dará una conexión para toda la duración de la transacción, y todas las declaraciones usarán esa única conexión de aislamiento. Esto es mucho mejor que no usar transacciones explícitas en primer lugar. En aplicaciones grandes, es posible que tenga muchas solicitudes simultáneas y la reducción de la tasa de solicitud de adquisición de conexión de base de datos definitivamente está mejorando el rendimiento general de la aplicación.
Así que la regla de oro es:
Si tiene transacciones de solo lectura que solo ejecutan una consulta, puede habilitar la confirmación automática para esas.
Si tiene transacciones que contienen más de una declaración, debe deshabilitar la confirmación automática, ya que desea que todas las operaciones se ejecuten en una sola unidad de trabajo y no desea ejercer una presión adicional sobre su conjunto de conexiones.