TransactionScope a annulé la transaction avant la mise au rebut
Lors de l'utilisation de TransactionScope il apperars que si exécutées en interne code roulé la transaction que le parent transaction de restauration ainsi. Ce qui est bon pour moi. Mais lors de la cession et qu'il déclenche une exception en ce sens que la transaction a été annulée et déjà abandonnée.
Alors, quelle est la bonne façon de les gérer et d'éliminer correctement la portée?
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
using (var conn = GetConnection())
{
string query =
@"some query that may contain transaction itself
or some SP whith transaction included"
using (var command = new SqlCommand(query, conn))
command.ExecuteNonQuery();
}
}
scope.Complete();
} //Exception here
Vous devez vous connecter pour publier un commentaire.
scope.Dispose()
peut jeterTransactionAborted
exception, même siscope.Complete()
a été appelé. Par exemple, certaines procédures stockées d'une assez intelligent pour gérer les exceptions et annuler la transaction à l'intérieur de script T-SQL à l'aide deT-SQL TRY/CATCH
construirew/o
jeter exception à l'appelant.Donc je ne considère pas l'approche la plus sûre, je voudrais suggérer comme suit:
Et ne vous inquiétez pas à propos de l'élimination
TransactionScope
. la portée.Disposer effectue tout ce qui est nécessaire pour le nettoyer avant de le jeterTransactionAborted
exception.Je n'utilise pas stockées procs ou SQL spécifiques try/catch, donc ma situation est légèrement différente, mais j'ai eu exactement la même transaction avortée exception mentionnée dans le post. J'ai trouvé que si j'ai un SELECT quelque part à l'intérieur de la primaire TransactionScope, qui sera la cause de la Transaction à s'engager, même si je ne suis pas sûr de savoir pourquoi. J'ai eu un cas où, afin de créer un objet dans la base de données d'abord vérifié pour s'assurer que l'objet n'existe pas déjà avec un SELECT, puis l'abandonner exception s'est produite lors de l'Éliminer a été appelé. J'ai regardé à l'Intérieur Exception et il a dit que la Transaction a été d'essayer de s'engager sans commencer. J'ai finalement essayé enveloppant ma SÉLECTIONNEZ dans Supprimée TransactionScope, et puis il a travaillé. Donc:
J'espère que cela aide quelqu'un d'autre qui ont peut-être eu cette exception sans l'aide stockées procs.
Si une exception jette à partir de votre requête interne de la portée.Complète (les) ligne " ll n'est pas exécuté.
Veuillez consulter le lien ci-dessous.. Et j'ai fait quelques changements à votre requête aussi. J'espère qu'elle doit travailler pour vous.
Étendue De La Transaction