Considérant ce morceau de code:La transaction C# avec l'exception gérée sera toujours annulée?
using(TransactionScope tran = new TransactionScope()) {
insertStatementMethod1();
insertStatementMethod2();
// this might fail
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
tran.Complete();
}
est-il quoi que ce soit fait dans insertStatementMethod1
et insertStatementMethod2
va être annulée? Dans tout les cas? Si je veux qu'ils s'exécutent de toute façon, je devrais vérifier si insertStatementMethod3
échouera avant la transaction et construire mon code de transaction basé sur cela?
Mise à jour
Le code ressemble à ce
using(TransactionScope tran = new TransactionScope()) {
// <standard code>
yourExtraCode();
// <standard code>
tran.Complete();
}
où je reçois d'écrire la méthode yourExtraCode()
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
insertStatementMethod3();
}
je ne peux modifier la méthode yourExtraCode()
, donc je ne peux pas a choisi d'être dans la portée de la transaction ou non. Une solution simple possible serait la suivante:
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
if (findOutIfIcanInsert()) { // <-- this would come by executing sql query
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
}
}
Mais cela viendrait avec la nécessité de chercher des choses dans la base de ce qui aurait une incidence sur la performance. Existe-t-il un meilleur moyen, ou je dois savoir avant d'appeler la méthode? J'ai essayé et, bien sûr, la transaction a été annulée comme prévu.
check this http://stackoverflow.com/questions/494550/how-does-transactionscope-roll-back-transactions –
En fait vous avez la possibilité de choisir de ne pas faire partie d'une transaction ambiante, voir ma réponse ci-dessous. –