web-dev-qa-db-fra.com

Une portée de transaction interne sera-t-elle annulée si la portée de transaction externe ne se termine pas?

J'ai deux étendues de transaction, l'une dans l'autre. J'aimerais savoir si la portée de la transaction interne sera annulée une fois qu'elle aura été validée et que la portée externe ne sera pas terminée.

49
Tebo

Puisqu'ils sont imbriqués, la transaction interne sera annulée.

Ce n'est pas toute l'histoire et dépend de la façon dont vous créez la transaction imbriquée, mais par défaut, elle sera annulée.

Cet article va en profondeur sur TransactionScope et devrait répondre à la plupart de vos questions.


Être distribué ou non n'est pas pertinent.

27
Oded

Cela dépend de l'option d'étendue avec laquelle vous démarrez l'étendue de la transaction imbriquée.

Si vous utilisez l'option par défaut TransactionScopeOption.Required alors la portée imbriquée s'inscrira dans la même transaction que la portée extérieure et en tant que telle lorsque la portée extérieure sera annulée, la portée intérieure sera également annulée même si elle a appelé Complete.

Cependant, si vous utilisez TransactionScopeOption.RequiresNew, alors la portée imbriquée commencera sa propre transaction et l'achèvera séparément de la portée externe, de sorte qu'elle ne sera pas annulée même si la portée extérieure est annulée.

Si tu utilises TransactionScopeOption.Suppress alors l'étendue imbriquée ne participera pas à la transaction externe et se terminera de manière non transactionnelle, ne fait donc pas partie du travail qui serait annulé si la transaction externe était annulée.

101
Greg Beech