Inscription dans une transaction distribuée
L'objet Connection s'inscrit automatiquement dans une transaction distribuée existante s'il détermine qu'une transaction est active. L'inscription automatique dans une transaction se produit lorsque la connexion est ouverte et extraite du pool de connexions. Vous pouvez désactiver l'inscription automatique dans des transactions existantes en spécifiant Enlist=false
comme paramètre de chaîne de connexion pour un SqlConnection ou OLE DB Services=-7
pour un OleDbConnection.
Si l'inscription automatique est désactivée, vous pouvez vous inscrire dans une transaction distribuée existante à l'aide de la méthode EnlistDistributedTransaction de l'objet Connection. L'inscription dans une transaction distribuée existante garantit que si la transaction vient à être annulée ou validée, les modifications apportées par le code dans la source de données seront elles aussi validées ou annulées.
EnlistDistributedTransaction est particulièrement applicable lors du regroupement d'objets métier. Si un objet métier est regroupé avec une connexion ouverte, l'inscription automatique dans la transaction se produit lorsque cette connexion est ouverte et tirée du pool. Si plusieurs transactions sont effectuées à l'aide de l'objet métier regroupé, la connexion ouverte pour cet objet n'est pas automatiquement inscrite dans les nouvelles transactions lancées. Dans ce cas, vous pouvez désactiver l'inscription automatique dans la transaction pour Connection et l'inscrire dans les transactions à l'aide de EnlistDistributedTransaction.
EnlistDistributedTransaction accepte un unique argument de type ITransaction qui est une référence à la transaction existante. Après avoir appelé Connection.EnlistDistributedTransaction, toutes les modifications apportées à la source de données à l'aide de Connection sont incluses dans la transaction.
Remarque Le Connection doit être ouvert avant l'appel à EnlistDistributedTransaction.
ATTENTION EnlistDistributedTransaction retourne une Exception si le Connection a déjà commencé une transaction au moyen de BeginTransaction. Toutefois, si la transaction est une transaction locale démarrée dans la source de données (par exemple, l'exécution explicite de l'instruction BEGIN TRANSACTION à l'aide de SqlCommand), EnlistDistributedTransaction annule la transaction locale et s'inscrit dans la transaction distribuée existante requise. Vous ne recevez pas d'avis d'annulation de la transaction locale et devez gérer toutes les transactions locales qui n'ont pas été démarrées à l'aide de BeginTransaction.
L'exemple suivant montre une page ASP.NET requérant une transaction. Le code ADO.NET présent dans la page s'inscrit dans la transaction.
<%@Page Transaction="Required" %>
<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.SqlClient"%>
<%@Import Namespace="System.EnterpriseServices"%>
<html>
<Script Runat="SERVER" Language="VB">
Sub Page_Load()
Dim ns As NorthwindSample = New NorthwindSample()
Dim customerId As String = "CUST1"
Dim companyName As String = "New Company Name"
Try
ns.AddCustomer(customerId, companyName, CType(ContextUtil.Transaction, ITransaction))
ContextUtil.SetComplete()
Response.Write("Customer " & Server.HtmlEncode(customerId) & " added.")
Catch e As Exception
ContextUtil.SetAbort()
Response.Write("Customer " & Server.HtmlEncode(customerId) & " not added. An exception of type " & _
e.GetType().ToString() & " was encountered.")
End Try
End Sub
Public Class NorthwindSample
Public Sub AddCustomer(customerId As String, companyName As String, trans As ITransaction)
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" & _
"Initial Catalog=Northwind;Enlist=false;")
Dim cmd As SqlCommand = New SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " & _
"Values(@CustomerId, @CompanyName)", nwindConn)
cmd.Parameters.Add("@CustomerId", SqlDbType.VarChar, 5).Value = customerId
cmd.Parameters.Add("@CompanyName", SqlDbType.VarChar, 40).Value = companyName
nwindConn.Open()
If Not trans Is Nothing Then
nwindConn.EnlistDistributedTransaction(trans)
End If
Try
cmd.ExecuteNonQuery()
Catch e As SqlException
Throw e
finally
nwindConn.Close()
End Try
End Sub
End Class
</Script>
</html>
[C#]
<%@Page Transaction="Required" %>
<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.SqlClient"%>
<%@Import Namespace="System.EnterpriseServices"%>
<html>
<Script Runat="SERVER" Language="C#">
void Page_Load()
{
NorthwindSample ns = new NorthwindSample();
string customerId = "CUST1";
string companyName = "New Company Name";
try
{
ns.AddCustomer(customerId, companyName, (ITransaction)ContextUtil.Transaction);
ContextUtil.SetComplete();
Response.Write("Customer " + Server.HtmlEncode(customerId) + " added.");
}
catch (Exception e)
{
ContextUtil.SetAbort();
Response.Write("Customer " + Server.HtmlEncode(customerId) + " not added. An exception of type " + e.GetType() + " was encountered.");
}
}
public class NorthwindSample
{
public void AddCustomer(string customerId, string companyName, ITransaction trans)
{
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;" +
"Initial Catalog=Northwind;Enlist=false;");
SqlCommand cmd = new SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " +
"Values(@CustomerId, @CompanyName)", nwindConn);
cmd.Parameters.Add("@CustomerId", SqlDbType.VarChar, 5).Value = customerId;
cmd.Parameters.Add("@CompanyName", SqlDbType.VarChar, 40).Value = companyName;
nwindConn.Open();
if (trans != null)
nwindConn.EnlistDistributedTransaction(trans);
try
{
cmd.ExecuteNonQuery();
}
catch (SqlException e)
{
throw(e);
}
finally
{
nwindConn.Close();
}
}
}
</Script>
</html>
Voir aussi
Utilisation des fournisseurs de données .NET Framework pour l'accès aux données | OleDbConnection, classe | OleDbTransaction, classe | SqlConnection, classe | SqlTransaction, classe | OdbcConnection, classe | OdbcTransaction, classe