Tengo una aplicación, más parecida a una utilidad, que se encuentra en una esquina y actualiza periódicamente dos bases de datos diferentes.¿Cuál es la "mejor" forma de hacer transacciones distribuidas en múltiples bases de datos usando Spring and Hibernate
Es una pequeña aplicación independiente que se ha creado con un contexto de aplicación de primavera. El contexto tiene dos Hibernate Session Factories configuradas en él, a su vez utilizando fuentes de datos de Commons DBCP configuradas en Spring.
Actualmente no hay administración de transacciones, pero me gustaría agregar algunas. La actualización de una base de datos depende de una actualización exitosa de la otra.
La aplicación no se encuentra en un contenedor Java EE, sino que está iniciada por una clase de iniciador estático llamada desde un script de shell. La clase de iniciador crea una instancia del contexto de la aplicación y luego invoca un método en uno de sus beans.
¿Cuál es la "mejor" forma de poner la transaccionalidad alrededor de las actualizaciones de la base de datos?
Dejaré la definición de "mejor" para ti, pero creo que debería ser una función de "fácil de configurar", "fácil de configurar", "barata" y "fácil de empaquetar y redistribuir" . Naturalmente, FOSS sería bueno.
Las transacciones distribuidas deben registrar las 4 propiedades ACID. ¿Cuál es tu problema? El escenario que describió no puede suceder, ya que los gerentes se comunican entre sí y solo se comprometen cuando todos los nodos participantes han intercambiado un "IR". – Falcon
@Falcon: ¿Qué ocurre si la red falla entre PREPARE y COMMIT? O uno de los servidores muere? "no puede suceder" no puede suceder en la realidad. –
No, no se les ordena retroceder porque en este escenario, algunos de los nodos ya se han confirmado. Lo que sucede es que cuando el nodo bloqueado está disponible, el coordinador de transacciones le dice que vuelva a comprometerse. Debido a que el nodo respondió positivamente en la fase de "preparación", se requiere poder "comprometer", incluso cuando se recupera de un bloqueo. –