Pregunta

Tengo el sistema basado en JBoss e Hibernate. Y necesito procesar dos operaciones largas. Las operaciones pueden ser probablemente más largas que el tiempo de espera de la transacción. Sus operaciones persisten muchas entidades, en dos transacciones diferentes. Y si algo sale mal, durante estas operaciones, debería revertir todos los cambios de las transacciones.

¿Cuál es la mejor manera de resolverlo?

Creo que la mejor manera es fusionar todas las operaciones en una sola transacción, pero requiere establecer el tiempo de espera de la transacción LOng, y es inaceptable para nuestro sistema.

¿Es mejor la gestión de muchas transacciones en esta situación? ¿Y cómo puedo hacerlo?

¿Fue útil?

Solución

¿Puede usar un servidor JTA (coordinador de transacciones) para realizar la transacción en varios pasos con transacciones XA? Esta publicación tiene un poco de fan- a un par de fuentes de código abierto que podrían funcionar para usted.

Las transacciones XA le permiten realizar un montón de operaciones más pequeñas y confirmar o hacerlos retroceder de un golpe. Intente buscar en Google 'hibernate xa transacciones'. La mayoría de las plataformas RDBMS modernas (MySQL 5.x, PostgreSQL, SQL Server, Oracle, DB2, Sybase, etc.) admiten transacciones XA.

Otros consejos

Usar una transacción es bueno, robusto, etc. Intente nuevamente convencer a su administrador ;-)


De lo contrario, puedo pensar en:

  • usando transacciones más cortas para insertar menos filas, usando un marcador que significa "incompleto" " ;. Esto podría estar en una columna existente o en una nueva (¿tal vez podría estar en una tabla diferente?).
  • si alguna operación revierte, intente nuevamente; si prefiere abortar toda la operación, puede elegir eliminar las filas que tienen el " incompleto " marcador.
  • cuando se comprometen todas las transacciones, puede abrir una última transacción, solo para marcar todas las filas como " completa " (ej .: actualización ... donde ... ). Esto debería ser mucho más rápido que la inserción completa, por lo que la transacción debería ser lo suficientemente corta.

Tuve que hacer algo similar en JPA (a través de hibernate). Hice la operación en N transacciones en lugar de 1 gran transacción. Esta operación se ejecutó raramente, era un trabajo automatizado, por lo que no había ningún usuario esperando un resultado en una página web.

¿Cuánto tiempo espera que tome la transacción? ¿Cuánto tiempo espera que el usuario espere? ¿Con qué frecuencia espera que ocurra esta operación? Tal vez sus requisitos no están claros.

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