Pregunta

Tengo un solo método de servicio anotado con Propagation.Required. Se lleva a cabo tres operaciones separadas.

  1. Insertar a la tabla 1 de la Tabla z si no hay registros están en la Tabla 1
  2. Insertar / Actualizar la tabla 1 según el usuario edita / Adiciones
  3. x registros de borrar de la tabla 1

Perdona mi ignorancia, pero no debe todo esto se ejecute en una sola transacción? En el sentido, si la tercera consulta se ejecuta en una excepción, no debe la primera y segunda reversión también? Esto no sucede en mi caso. Hibernará automático cometer ajuste afectará a los límites TXn de alguna manera? Auto cometen se establece en true en mi caso. Lo que requiero es la confirmación debería tener lugar en cualquiera de estas tablas sólo si todos tienen éxito.

¿Fue útil?

Solución

Sí, el valor de la propiedad connection.autocommit Hibernate afectará límites de la transacción.

Si lo ajusta en true, Hibernate poner la conexión JDBC subyacente en el modo de confirmación automática, que envolverá cada instrucción se ejecuta en su propia transacción de base de datos.

Así, por ejemplo, si su tercera pregunta / afirmación falla, sólo su tercera pregunta / afirmación conseguirá deshace.

Para ejecutar los tres como una sola unidad, es necesario tener la confirmación automática y ejecutar los tres en el contexto de una única transacción, declarativa o de otra manera.

Otros consejos

se puede tratar de añadir una capa más alta que la capa de servicio y de iniciar la transacción a partir de ahí.

definitivamente no quieren compromiso automático. Eso probablemente comprometerse después de cada operación. Interruptor automático desactivado OFF, y añadir un compromiso explícito al final.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top