2009-10-29 6 views
1

J'ai deux sources de données: une ancienne (service Web) et une base de données. Maintenant, lorsque je traite la demande, j'ai apporté des modifications aux deux. En cas d'erreur, je veux annuler les deux. Le problème est: que se passe-t-il si l'héritage hérité pendant la restauration (c'est-à-dire une erreur réseau)? db.Rollback() ne sera pas exécuté. Et vice versa. La solution que je vois est:Gestion des transactions pour deux sources de données indépendantes en une seule

legacy.Begin(); 
try 
{ 
    db.Begin(); 
    try 
    { 
     legacy.MakeChanges(); db.MakeChanges(); 
    } 
    except (Exception) 
    { 
    db.Rollback(); 
    throw; 
    } 
} 
except (Exception) 
{ 
    legacy.Rollback(); 
    throw; 
} 

Est-il acceptable? Y a-t-il une meilleure solution?

Répondre

1

Vous exécutez efficacement vos propres transactions de validation en deux phases. Une solution complètement robuste requiert la coopération des deux ressources et est généralement mieux réalisée à l'aide d'un gestionnaire de transactions compatible 2PC.

Le problème fondamental ici est que vous n'avez aucune protection contre l'échec de votre propre application (il joue le rôle de gestionnaire de transactions) et donc aucune garantie que vous pouvez restaurer cet héritage. Envisager une défaillance de votre application juste au moment où il était sur le point d'appeler legcacy.Rollbock(). Vous n'avez maintenant aucun enregistrement que vous étiez au milieu d'une «transaction» et donc quand votre application revient, vous n'avez aucune raison d'aller exécuter cette restauration. Approches possibles:

1). Utilisez true 2PC, ceci n'est possible que si votre WebSerice a des capacités transactionnelles (techniquement possible mais pratiquement improbable).

2). Tolérer le risque de certaines incohérences. De nombreux systèmes le font par inadvertance,

3). Essayez le type de rétablissement que vous allez pour mais acceptez qu'il peut échouer. Ajouter une forme de piste d'audit qui permet la détection de résultats incertains et permet donc une mise à jour manuelle plus tard. Ainsi, vous pouvez ajouter une sorte de journalisation d'audit qui vous permettrait de détecter les activités incompatibles. Cela peut être vu comme une sorte d'approche 2PC très manuelle.

+0

Je contrôle le service Web et ses sources, mais dans une certaine mesure afin que la compatibilité héritée ne soit pas rompue. Cependant, je ne pense pas que je peux investir dans sa compatibilité complète 2PC (en raison de l'horaire); Je pense que nous pouvons vivre aveC# 2 (et corriger manuellement si nécessaire). Je suis également très intéressé par le concept 2PC; pouvez-vous recommander une bonne lecture à ce sujet? Google montre de nombreux liens, principalement sur Java, alors que je préfère la lecture générale ou C#. – queen3

+0

Un point de départ dans le monde MS est ici http://msdn.microsoft.com/en-us/library/aa213077%28SQL.80%29.aspx la capacité de service Web pour participer à un véritable 2PC est WS http Transaction atomique : //msdn.microsoft.com/en-us/library/ms733943.aspx – djna

+0

Eh bien, merci pour l'info, c'est utile. Mais encore je pense que nous irons # 3, ce n'est pas un système critique, nous pouvons réparer les choses manuellement une fois par mois (ou même la semaine). La mise en œuvre du gestionnaire de transactions, etc., est définitivement hors budget. – queen3

Questions connexes