2009-09-30 10 views
3

j'ai un scénario dans lequel l'unité du travail est défini comme:opérations de manutention couvrant l'ensemble des serveurs de base de données

Update table T1 in database server S1 
Update table T2 in database server S2 

Et je veux l'unité au-dessus du travail se produise complètement ou pas du tout (comme cas avec toute transaction de base de données). Comment puis-je faire ceci? J'ai beaucoup cherché et trouvé ce post proche de ce que j'attends, mais cela semble être très spécifique à Hibernate. J'utilise Spring, iBatis et Tomcat (6.x) comme conteneur.

+0

Une solution basée sur FOSS serait très utile. – peakit

+0

JBoss Transaction Manager est open source et peut être utilisé sans nécessiter le conteneur JBoss entier. – SteveD

+0

Et vos deux bases de données doivent prendre en charge XA - tout le monde ne le fait pas et leur niveau de stabilité/fonctionnalité peut être une source de préoccupation. – SteveD

Répondre

6

Cela dépend vraiment de la robustesse d'une solution dont vous avez besoin. Le niveau minimal de fiabilité sur une telle chose est des transactions XA. Pour l'utiliser, vous avez besoin d'une base de données et d'un pilote JDBC qui le supporte pour les démarreurs, alors vous pouvez configurer Spring pour l'utiliser (here est un aperçu). Si XA n'est pas assez robuste pour vous (XA a des scénarios de défaillance, comme si quelque chose ne va pas dans la seconde phase des commits, comme une panne matérielle) alors ce que vous devez vraiment faire est de mettre toutes les données dans une base de données, puis avoir un processus séparé le propager. Les données peuvent donc être incohérentes, mais elles peuvent être récupérées.

Editer: Ce que je veux dire est que mettre l'ensemble des données dans une base de données. Soit la première base de données, soit une base de données différente à cet effet. Cette base de données deviendrait essentiellement une file d'attente à partir de laquelle la vue de données finale serait alimentée. L'écriture dans cette base de données (en supposant un produit de base de données décent) sera terminée, ou échouera complètement. Ensuite, un thread séparé interrogerait cette base de données et distribuerait les données manquantes aux autres bases de données. Donc, si le processus échoue, lorsque ce thread redémarre, il continuera le processus de distribution. Les données peuvent ne pas exister dans tous les endroits où vous le souhaitez, mais rien ne serait perdu.

+0

"Si XA n'est pas assez robuste pour vous alors ce que vous avez vraiment besoin de faire est de mettre toutes les données dans une base de données et d'avoir un processus séparé pour le propager" Pourriez-vous expliquer ce point? Que voulez-vous dire par «mettre toutes les données au même endroit» et que «le processus séparé le propage» – peakit

2

Vous souhaitez un gestionnaire de transactions distribué. J'aime utiliser Atomikos qui peut être exécuté dans une JVM.

+0

Est-ce gratuit et open source? – peakit

+0

@peakit, en regardant leur site Web, ils ont une version sous licence (inscription nécessaire pour accéder au téléchargement) Apache 2.0, et une version fermée plus avancée. – Yishai