Je pratique des modifications de données sur plusieurs bases de données et je souhaite mettre en œuvre une transaction qui couvrira toutes les modifications.
C'est ce que j'ai actuellement: P>
try
{
db[1].begintransaction();
db[1].ExecuteNonQuery();
db[2].begintransaction();
db[2].ExecuteNonQuery();
...
db[N].begintransaction();
db[N].ExecuteNonQuery();
// will execute only if no exception raised during the process
for (int a = 0; a < N; a++)
{
db[a].Commit();// what if there is an error/exception here
}
}
catch
{
for (int a = 0; a < N; a++)
{
db[a].RollBack();
}
}
4 Réponses :
Utilisez le transactionsCope classe comme ceci:
using (TransactionScope ts = new TransactionScope())
{
//all db code here
// if an error occurs jump out of the using block and it will dispose and rollback
ts.Complete();
}
@Jesse, je pense que pour la transaction entre bases de données, même dans la dernière version de .NET, le coordonnateur de la transaction distribuée Microsoft sera nécessaire. Je n'ai pas pu comprendre pourquoi vous avez dit que cela ne sera pas nécessaire?
@Sunil vous avez totalement raison. C'était un malentendu de ma part du framework .NET à l'époque. Je vais procéder pour supprimer le commentaire erroné. Merci de m'avoir aveuglé! =)
Comme le dit Cletus, vous avez besoin d'une sorte de commit deux phases a>. Comme le dit l'article, cela ne fonctionne pas toujours dans la pratique. Si vous avez besoin d'une solution robuste, vous devez trouver un moyen de sérialiser les transactions de manière à ce que vous puissiez les faire une après l'autre et les rouler individuellement. P>
Étant donné que cela dépend du cas spécifique sur lequel vous ne fournissez aucun détail, je ne peux pas vous donner des idées comment attaquer cela. P>
Si vous souhaitez exécuter une transaction sur plusieurs instances de SQL Server, jetez un coup d'œil au Coordonnateur de transaction distribué Microsoft Documentation P>
Utilisation de transactionsCope est la réponse. Il fonctionne même avec différents SGBD !!! p>
Remarque: Ce n'est pas le code réel. ive la modifiait considérablement pour la clarté
Hey, je reçois le même problème ... et mes bases de données peuvent être un serveur MySQL et SQL ... fonctionnera-t-il avec TransactionsCope?