Partager via


Transactions automatiques et classes .NET Framework

Des instances d'une classe .NET Framework peuvent participer à une transaction automatique dans la mesure où vous avez préparé la classe à cet effet. Chaque ressource faisant l'objet d'un accès par une instance de classe (ou par un objet) s'inscrit dans la transaction. Par exemple, si un objet utilise ADO.NET pour envoyer de l'argent sur un compte dans une base de données, le gestionnaire de ressources de la base de données détermine si l'objet doit s'exécuter dans une transaction. Le cas échéant, il inscrit automatiquement la base de données dans la transaction.

Procédez comme suit pour préparer une classe en vue de sa participation à une transaction automatique :

  1. Appliquez TransactionAttribute à votre classe.

  2. Dérivez votre classe de la classe ServicedComponent.

  3. Signez l'assembly avec un nom fort.

    Pour signer l'assembly à l'aide d'attributs, créez une paire de clé à l'aide de Sn.exe :

    sn -k TestApp.snk
    

    Ajoutez l'attribut d'assembly AssemblyKeyFileAttribute ou AssemblyKeyNameAttribute spécifiant le nom du fichier contenant la paire de clés pour signer l'assembly avec un nom fort.

    <assembly: AssemblyKeyFileAttribute("TestApp.snk")>
    [C#]
    [assembly: AssemblyKeyFileAttribute("TestApp.snk")]
    

    Pour plus d'informations, consultez Signature d'un assembly avec un nom fort.

  4. Inscrivez l'assembly qui contient votre classe dans le catalogue COM+.

    Si le client qui appelle des instances de votre classe est managé par le Common Language Runtime, l'inscription est automatique. Toutefois, si vous estimez qu'un appelant non managé peut créer et appeler des instances de votre classe, utilisez l'outil .NET Services Installation Tool (Regsvcs.exe) pour effectuer l'inscription manuellement.

L'exemple suivant montre comment appliquer l'attribut TransactionAttribute à une classe dérivée de la classe ServicedComponent.

<Transaction(TransactionOption.Required)> Public Class SampleClass
   Inherits ServicedComponent
   '. . .
End Class
[C#]
[Transaction(TransactionOption.Required)]
public class SampleClass(): ServicedComponent
{
  //. . .
}

Lorsque vous appliquez l'attribut de transaction, vous pouvez utiliser indifféremment Transaction, transaction, TransactionAttribute et transactionattribute. Par exemple, Transaction et transactionattribute produisent des résultats identiques.

Le tableau suivant répertorie et décrit brièvement chaque variation de constructeur :

Valeur de l'attribut Description
Disabled Élimine le contrôle des transactions automatiques sur l'objet. Un objet auquel cette valeur d'attribut est appliquée peut engager directement le coordinateur de transactions distribuées (DTC, Distributed Transaction Coordinator) pour la prise en charge transactionnelle.
[Transaction(TransactionOption.Disabled)]
NotSupported Indique que l'objet ne fonctionne pas dans le cadre de transactions. Lorsqu'une demande est traitée, son contexte d'objet est créé sans transaction, qu'une transaction soit active ou non.
[Transaction(TransactionOption.NotSupported)]
Supported Indique que l'objet s'exécute dans le contexte d'une transaction existante, s'il en existe une. Si aucune transaction n'existe, l'objet s'exécute sans transaction.
[Transaction(TransactionOption.Supported)]
Required

(par défaut)

Indique que l'objet nécessite une transaction. Il s'exécute dans la portée d'une transaction existante, le cas échéant. S'il n'existe pas de transaction, l'objet en démarre une.
[Transaction(TransactionOption.Required)]
RequiresNew Indique que l'objet exige une transaction et démarre une nouvelle transaction pour chaque demande.
[Transaction(TransactionOption.RequiresNew)]

Exemple de classe

L'exemple de code suivant illustre l'utilisation de divers éléments d'une transaction automatique. Dans cet exemple, la classe transactionnelle et le client qui l'appelle sont tous les deux managés par le runtime.

' -----------------------------------------------------------------
' TestApp.vb
' Generate a Strong name: 
'    sn -k TestApp.snk
' Compile the code:
'    vbc /target:exe /r:System.EnterpriseServices.dll TestApp.vb
' Run TestApp:
'    start TestApp.exe
' -----------------------------------------------------------------
Option Explicit
Option Strict

Imports System
Imports System.Runtime.CompilerServices
Imports System.EnterpriseServices
Imports System.Reflection

'Registration details.
'COM+ application name as it appears in the COM+ catalog.
<assembly: ApplicationName("TestApp")>
'Strong name for assembly.
<assembly: AssemblyKeyFileAttribute("TestApp.snk")>

<Transaction(TransactionOption.Required)> Public Class Account
   Inherits ServicedComponent
   
   'Provides SetComplete behavior in the absence of exceptions.
   <AutoComplete()> Public Sub Debit(amount As Integer)
      ' Do some database work. Any exception thrown here aborts the 
      ' transaction; otherwise, transaction commits.
   End Sub
End Class

Public Class client
   Public Shared Sub Main()
      Dim accountX As New Account()
      accountX.Debit(100)
      Environment.Exit(0)
   End Sub
End Class
[C#]
// -----------------------------------------------------------------
// TestApp.cs
// Generate a Strong name: 
//    sn -k TestApp.snk
// Compile the code:
//    csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs
// Run TestApp:
//    start TestApp.exe
// -----------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
using System.EnterpriseServices;
using System.Reflection;

//Registration details.
//COM+ application name as it appears in the COM+ catalog.
[assembly: ApplicationName("TestApp")]
//Strong name for assembly.
[assembly: AssemblyKeyFileAttribute("TestApp.snk")]

[Transaction(TransactionOption.Required)]
public class Account : ServicedComponent
{
  //Provides SetComplete behavior in the absence of exceptions.
  [AutoComplete]
  public void Debit(int amount)
  {
     // Do some database work. Any exception thrown here aborts the 
     // transaction; otherwise, transaction commits.
  }
}

public class client
{
  public static int Main() 
  {
    Account accountX = new Account();
    accountX.Debit(100);
    return 0;
  }
}

Voir aussi

Transactions automatiques | Vote dans une transaction automatique | Écriture de composants de service