2013-01-04 4 views
1

J'ai une méthode comme ci-dessous en C#:transaction MongoDB

private void Save(object) 
{ 
    mongoCollection.Save(object); 
    someotherRelationaldb.Save(object); 
} 

J'ai deux dans BDs que je dois enregistrer un objet. L'un est MongoDB et l'autre est un serveur DB SQL relationnel. Si le COMMIT Relational DB échoue, je veux restaurer le MongoDB sauver (je voudrais maintenir l'ordre de sauvegarde). Quel serait le bon moyen de revenir en arrière en utilisant le pilote C#.

Répondre

1

Vous ne pouvez pas.
La seule façon de le faire serait d'envelopper someotherRelationaldb.Save(object); dans une prise d'essai, et sur les prises, faire mongoCollection.Remove

Vous auriez probablement besoin d'un identifiant de propriété connu sur object et pourrait faire quelque chose comme:

mongoCollection.Remove(Query.EQ("_id", object.Id)); 

Ainsi, plutôt untidily, votre méthode Save ressemblerait un peu comme:

private void Save(object) 
{ 
    mongoCollection.Save(object); 

    try 
    { 
     someotherRelationaldb.Save(object); 
    } 
    catch 
    { 
     mongoCollection.Remove(Query.EQ("_id", object.Id)); 
    } 
} 

une autre façon est de stocker une propriété de drapeau sur le object qui get mis à jour après l'écriture réussie à someOtherRelationaldb

Ce n'est pas exactement l'idéal non plus, mais vous pouvez modifier votre requête docs seulement de retour où IsPersisted drapeau est vrai.

Aucune de ces approches vont jouer bien dans un environnement fortement fragmentées même si je ne pense pas.

+0

merci .. que je pensais .. et mon sauver pourrait être soit mise à jour ou insérer – ajp

+0

:) dans le cas d'une mise à jour, vous voudrez peut-être pas retirer le doc .. mais revenir à la dernière version avant la mise à jour ? Juste quelque chose à garder à l'esprit – Alex

Questions connexes