web-dev-qa-db-fra.com

Distribué - sur plusieurs bases de données ou serveurs - Transactions

J'ai des doutes liées aux transactions en SQL. Je joue en dessous des étapes.

  1. Connexion 1 Ouvrir pour la base de données DB1
  2. Commencer la transaction pour la connexion 1
  3. Exécutez les commandes sur la connexion 1
  4. Connexion 2 Ouvrir pour la base de données DB2
  5. Commencer la transaction pour la connexion 2
  6. Exécutez les commandes sur la connexion 2
  7. Commettre la transaction pour la connexion 2
  8. Commettre la transaction pour la connexion 1

Si la transaction commettre sur la connexion 1 échoue (retourne), la transaction sur la connexion 2 devrait-elle être annulée. C'est possible? Comment ça peut être fait?

4
IT researcher

Oui, cela peut être fait mais vous avez besoin d'un tiers agissant comme coordonnateur de transaction. Le protocole standard à ceci est appelé Deuxième commit (2PC). Cela se fait généralement avec un gestionnaire de transactions agissant en tant que coordinateur.

Cela peut également être généralisé à plus de deux bases de données. En fait, il n'a même pas besoin d'être des bases de données car l'approche est généralement appliquée aux "ressources transactionnelles". Outre les bases de données, l'autre ressource transactionnelle commune est une file d'attente de message. L'exemple habituel consiste à effectuer des travaux dans une base de données (Ex: mettre à jour un solde de compte) et envoyer un message sur une file d'attente de message (ex: un ordre sortant).

Pour que cela fonctionne, vos données de données doivent prendre en charge 2PC, généralement via le [~ # ~] XA [~ # ~ ~] Protocole. Comment le faire dépend du type spécifique de la langage de données et de programmation (ex: pour Java vous utiliseriez un xadatasource ).

9
sehrope