Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source
Ce sujet n'a pas encore été évalué - Évaluez ce sujet

TransactionScope, classe

Rend un bloc de code transactionnel. Cette classe ne peut pas être héritée.

System.Object
  System.Transactions.TransactionScope

Espace de noms :  System.Transactions
Assembly :  System.Transactions (dans System.Transactions.dll)
public sealed class TransactionScope : IDisposable

Le type TransactionScope expose les membres suivants.

  Nom Description
Méthode publique TransactionScope() Initialise une nouvelle instance de la classe TransactionScope.
Méthode publique TransactionScope(Transaction) Initialise une nouvelle instance de la classe TransactionScope et définit la transaction spécifiée comme une transaction ambiante, afin que le travail transactionnel fait à l'intérieur de la portée utilise cette transaction.
Méthode publique TransactionScope(TransactionScopeOption) Initialise une nouvelle instance de la classe TransactionScope avec les critères spécifiés.
Méthode publique TransactionScope(Transaction, TimeSpan) Initialise une nouvelle instance de la classe TransactionScope avec la valeur de délai d'attente spécifiée et définit la transaction spécifiée comme transaction ambiante afin que le travail transactionnel fait à l'intérieur de la portée utilise cette transaction.
Méthode publique TransactionScope(TransactionScopeOption, TimeSpan) Initialise une nouvelle instance de la classe TransactionScope avec les critères et la valeur de délai d'attente spécifiés.
Méthode publique TransactionScope(TransactionScopeOption, TransactionOptions) Initialise une nouvelle instance de la classe TransactionScope avec les critères spécifiés.
Méthode publique TransactionScope(Transaction, TimeSpan, EnterpriseServicesInteropOption) Initialise une nouvelle instance de la classe TransactionScope avec la valeur de délai d'attente et les critères d'interopérabilité COM+ spécifiés, et définit la transaction spécifiée comme une transaction ambiante afin que le travail transactionnel fait à l'intérieur de la portée utilise cette transaction.
Méthode publique TransactionScope(TransactionScopeOption, TransactionOptions, EnterpriseServicesInteropOption) Initialise une nouvelle instance de la classe TransactionScope avec la portée, les critères d'interopérabilité COM+ et les options de transaction spécifiés.
Début
  Nom Description
Méthode publique Complete Indique que toutes les opérations dans la portée sont terminées avec succès.
Méthode publique Dispose Termine la portée de transaction.
Méthode publique Equals(Object) Détermine si l'Object spécifié est égal à l'Object en cours. (Hérité de Object.)
Méthode protégée Finalize Autorise un objet à tenter de libérer des ressources et d'exécuter d'autres opérations de netto***ge avant qu'il ne soit récupéré par l'opération garbage collection. (Hérité de Object.)
Méthode publique GetHashCode Sert de fonction de hachage pour un type particulier. (Hérité de Object.)
Méthode publique GetType Obtient le Type de l'instance actuelle. (Hérité de Object.)
Méthode protégée MemberwiseClone Crée une copie superficielle de l'objet Object actif. (Hérité de Object.)
Méthode publique ToString Retourne une chaîne qui représente l'objet actuel. (Hérité de Object.)
Début

L'infrastructure System.Transactions fournit à la fois un modèle de programmation explicite basé sur la classe Transaction et un modèle de programmation implicite à l'aide de la classe TransactionScope dans laquelle les transactions sont gérées automatiquement par l'infrastructure.

Remarque importante Important

Il est recommandé de créer des transactions implicites à l'aide de la classe TransactionScope afin que le contexte de la transaction ambiante soit géré automatiquement. Vous devez également utiliser la classe TransactionScope et DependentTransaction pour les applications qui requièrent l'utilisation de la même transaction pour plusieurs appels de fonction ou plusieurs appels de thread. Pour plus d'informations sur ce modèle, consultez la rubrique Implementing An Implicit Transaction Using Transaction Scope. Pour plus d'informations sur l'écriture d'une application transactionnelle, consultez Writing A Transactional Application.

Sur une instanciation d'une TransactionScope par l'instruction new, le gestionnaire de transactions détermine la transaction à laquelle participer. Une fois déterminée, la portée participe toujours à cette transaction. La décision est basée sur deux facteurs : la présence d'une transaction ambiante et la valeur du paramètre TransactionScopeOption dans le constructeur. La transaction ambiante est la transaction dans laquelle votre code s'exécute. Vous pouvez obtenir une référence à la transaction ambiante en appelant la propriété Current statique de la classe Transaction. Pour plus d'informations sur la façon dont ce paramètre est utilisé, consultez la section « Gestion du flux de transaction » dans la rubrique Implementing An Implicit Transaction Using Transaction Scope.

Si aucune exception ne se produit dans la portée de transaction (c'est-à-dire entre l'initialisation de l'objet TransactionScope et l'appel à sa méthode Dispose), la transaction à laquelle la portée participe est autorisée à continuer. Si une exception se produit dans la portée de la transaction, la transaction à laquelle elle participe sera restaurée.

Lorsque votre application termine tout le travail qu'elle souhaite exécuter dans une transaction, vous devez appeler la méthode Complete une fois seulement pour informer ce gestionnaire de transactions qu'il est acceptable de valider la transaction. Ne pas appeler cette méthode entraîne l'abandon de la transaction.

Un appel de la méthode Dispose marque la fin de la portée de transaction. Les exceptions qui se produisent après avoir appelé cette méthode peuvent ne pas affecter la transaction.

Si vous modifiez la valeur de Current à l'intérieur d'une portée, une exception est levée lorsque Dispose est appelé. Toutefois, la valeur précédente est restaurée à la fin de la portée. De plus, si vous appelez Dispose sur Current à l'intérieur d'une portée de transaction qui a créé la transaction, la transaction est abandonnée à la fin de la portée.

L'exemple suivant montre comment utiliser la classe TransactionScope pour définir un bloc de code en vue de participer à une transaction.


// This function takes arguments for 2 connection strings and commands to create a transaction 
// involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the 
// transaction is rolled back. To test this code, you can connect to two different databases 
// on the same server by altering the connection string, or to another 3rd party RDBMS by 
// altering the code in the connection2 code block.
static public int CreateTransactionScope(
    string connectString1, string connectString2,
    string commandText1, string commandText2)
{
    // Initialize the return value to zero and create a StringWriter to display results.
    int returnValue = 0;
    System.IO.StringWriter writer = new System.IO.StringWriter();

    try
    {
        // Create the TransactionScope to execute the commands, guaranteeing
        // that both commands can commit or roll back as a single unit of work.
        using (TransactionScope scope = new TransactionScope())
        {
            using (SqlConnection connection1 = new SqlConnection(connectString1))
            {
                // Opening the connection automatically enlists it in the 
                // TransactionScope as a lightweight transaction.
                connection1.Open();

                // Create the SqlCommand object and execute the first command.
                SqlCommand command1 = new SqlCommand(commandText1, connection1);
                returnValue = command1.ExecuteNonQuery();
                writer.WriteLine("Rows to be affected by command1: {0}", returnValue);

                // If you get here, this means that command1 succeeded. By nesting
                // the using block for connection2 inside that of connection1, you
                // conserve server and network resources as connection2 is opened
                // only when there is a chance that the transaction can commit.   
                using (SqlConnection connection2 = new SqlConnection(connectString2))
                {
                    // The transaction is escalated to a full distributed
                    // transaction when connection2 is opened.
                    connection2.Open();

                    // Execute the second command in the second database.
                    returnValue = 0;
                    SqlCommand command2 = new SqlCommand(commandText2, connection2);
                    returnValue = command2.ExecuteNonQuery();
                    writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
                }
            }

            // The Complete method commits the transaction. If an exception has been thrown,
            // Complete is not  called and the transaction is rolled back.
            scope.Complete();

        }

    }
    catch (TransactionAbortedException ex)
    {
        writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
    }
    catch (ApplicationException ex)
    {
        writer.WriteLine("ApplicationException Message: {0}", ex.Message);
    }

    // Display messages.
    Console.WriteLine(writer.ToString());

    return returnValue;
}


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

Ce type est thread-safe.

Cela vous a-t-il été utile ?
(1500 caractères restants)
Contenu de la communauté Ajouter
Annotations FAQ
Error in C# sample code
The line scope.complete() is out of scope