Partager via


TransactionScope Classe

Définition

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

public ref class TransactionScope sealed : IDisposable
public sealed class TransactionScope : IDisposable
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public sealed class TransactionScope : IDisposable
type TransactionScope = class
    interface IDisposable
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
type TransactionScope = class
    interface IDisposable
Public NotInheritable Class TransactionScope
Implements IDisposable
Héritage
TransactionScope
Attributs
Implémente

Exemples

L’exemple suivant montre comment utiliser la TransactionScope classe pour définir un bloc de code pour 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);
    }

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

    return returnValue;
}
'  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.
Public Function CreateTransactionScope( _
  ByVal connectString1 As String, ByVal connectString2 As String, _
  ByVal commandText1 As String, ByVal commandText2 As String) As Integer

    ' Initialize the return value to zero and create a StringWriter to display results.
    Dim returnValue As Integer = 0
    Dim writer As System.IO.StringWriter = 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 scope As New TransactionScope()
            Using connection1 As 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.
                Dim command1 As SqlCommand = 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 connection2 As 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
                    Dim command2 As SqlCommand = New SqlCommand(commandText2, connection2)
                    returnValue = command2.ExecuteNonQuery()
                    writer.WriteLine("Rows to be affected by command2: {0}", returnValue)
                End Using
            End Using

        ' The Complete method commits the transaction. If an exception has been thrown,
        ' Complete is called and the transaction is rolled back.
        scope.Complete()
        End Using
    Catch ex As TransactionAbortedException
        writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message)
    End Try

    ' Display messages.
    Console.WriteLine(writer.ToString())

    Return returnValue
End Function

Remarques

L’infrastructure System.Transactions fournit à la fois un modèle de programmation explicite basé sur la Transaction classe, ainsi qu’un modèle de programmation implicite utilisant la TransactionScope classe , dans lequel les transactions sont gérées automatiquement par l’infrastructure.

Important

Nous vous recommandons de créer des transactions implicites à l’aide de la TransactionScope classe , afin que le contexte de transaction ambiant soit géré automatiquement pour vous. Vous devez également utiliser la classe et DependentTransaction pour les TransactionScope applications qui nécessitent l’utilisation de la même transaction sur plusieurs appels de fonction ou plusieurs appels de thread. Pour plus d’informations sur ce modèle, consultez la rubrique Implémentation d’une transaction implicite à l’aide de l’étendue de transaction . Pour plus d’informations sur l’écriture d’une application transactionnelle, consultez Écriture d’une application transactionnelle.

Lors de l’instanciation d’un 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. Cette 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é Transaction.Current statique de la classe Transaction. Pour plus d’informations sur l’utilisation de ce paramètre, consultez la section « Gestion des flux de transaction » de la rubrique Implémentation d’une transaction implicite à l’aide de l’étendue de transaction .

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

Lorsque votre application effectue tout le travail qu’elle souhaite effectuer dans une transaction, vous ne devez appeler la Complete méthode qu’une seule fois pour informer ce gestionnaire de transactions qu’il est acceptable de valider la transaction. Si vous n’appelez pas cette méthode, la transaction est abandonnée.

Un appel à la Dispose méthode marque la fin de l’étendue de la transaction. Il est possible que les exceptions qui se produisent après l’appel à cette méthode n’affectent pas la transaction.

Si vous modifiez la valeur de Current à l’intérieur d’une étendue, une exception est levée quand Dispose est appelé. Toutefois, à la fin de l’étendue, la valeur précédente est restaurée. En outre, si vous appelez Dispose à Current l’intérieur d’une étendue de transaction qui a créé la transaction, la transaction abandonne à la fin de l’étendue.

Constructeurs

TransactionScope()

Initialise une nouvelle instance de la classe TransactionScope.

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.

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.

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.

TransactionScope(Transaction, TimeSpan, TransactionScopeAsyncFlowOption)

[Pris en charge dans le .NET Framework 4.5.1 et versions ultérieures]

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.

TransactionScope(Transaction, TransactionScopeAsyncFlowOption)

[Pris en charge dans le .NET Framework 4.5.1 et versions ultérieures]

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.

TransactionScope(TransactionScopeAsyncFlowOption)

Initialise une nouvelle instance de la classe TransactionScope avec l'option de flux asynchrone spécifiée.

TransactionScope(TransactionScopeOption)

Initialise une nouvelle instance de la classe TransactionScope avec les critères spécifiés.

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.

TransactionScope(TransactionScopeOption, TimeSpan, TransactionScopeAsyncFlowOption)

Initialise une nouvelle instance de la classe TransactionScope avec le délai, les spécifications et l'option de flux asynchrone spécifiés.

TransactionScope(TransactionScopeOption, TransactionOptions)

Initialise une nouvelle instance de la classe TransactionScope avec les critères spécifiés.

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.

TransactionScope(TransactionScopeOption, TransactionOptions, TransactionScopeAsyncFlowOption)

[Pris en charge dans le .NET Framework 4.5.1 et versions ultérieures]

Initialise une nouvelle instance de la classe TransactionScope avec les spécifications et l'option de flux asynchrone spécifiées.

TransactionScope(TransactionScopeOption, TransactionScopeAsyncFlowOption)

Initialise une nouvelle instance de la classe TransactionScope avec les spécifications et l'option de flux asynchrone spécifiées.

Méthodes

Complete()

Indique que toutes les opérations dans la portée sont terminées avec succès.

Dispose()

Termine la portée de transaction.

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

S’applique à

Cohérence de thread

Ce type est thread-safe.

Voir aussi