6 Steps to Enable Transactions in WCF






4.74/5 (46 votes)
6 steps to enable transactions in WCF
Table of Contents
- Introduction and Goal
- Step 1: Create Two WCF Services
- Step 2: Attribute Interface Methods with TransactionFlow
- Step 3: Attribute the Implementation with TransactionScopeRequired
- Step 4: Enable Transaction Flow using WCF Service Config File
- Step 5: Call the 2 Services in One Transaction
- Step 6: Test If Your Transaction Works
- History
Introduction and Goal
In this article, we will try to understand how we can implement transactions in WCF service. So we will create two WCF services which do database transactions and then unite them in one transaction. We will first understand the 6 important steps to enable transactions in WCF services. At the end of the article, we will try to force an error and see how the transaction is rolled back after the error.
Step 1: Create Two WCF Services
The first step is to create two WCF service projects which will participate in one transaction. In both of these WCF services, we will do database transactions and we will try to understand how a WCF transaction unifies them. We have also created a web application with name WCFTransactions
which will consume both the services in one transaction scope.
Step 2: Attribute Interface Methods with TransactionFlow
In both the WCF services, we will create a method called UpdateData
which will insert into the database. So the first thing is to create the interface class with ServiceContract
attribute and the method UpdateData
with OperationContract
attribute. In order to enable transaction in UpdateData
method, we need to attribute it with TransactionFlow
and we have specified that transactions are allowed for this method using TransactionFlowOption.Allowed enum
.
[ServiceContract]
public interface IService1
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateData();
}
Step 3: Attribute the Implementation with TransactionScopeRequired
The 3rd step is to attribute the implementation of the WCF services with TransactionScopeRequired
as true
. Below is the code snippet which has a simple database inserting function, i.e. UpdateData
which is attributed by TransactionScopeRequired
attribute.
[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData()
{
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
SqlCommand objCommand = new SqlCommand("insert into Customer
(CustomerName,CustomerCode) values('sss','sss')",objConnection);
objCommand.ExecuteNonQuery();
objConnection.Close();
}
Step 4: Enable Transaction Flow using WCF Service Config File
We also need to enable transactions for wsHttpBinding
by setting the transactionFlow
attribute to true
.
<bindings>
<wsHttpBinding>
<binding name="TransactionalBind" transactionFlow="true"/>
</wsHttpBinding>
</bindings>
The transaction enabled binding we need to attach with the end point through which our WCF service is exposed.
<endpoint address="" binding="wsHttpBinding"
bindingConfiguration="TransactionalBind" contract="WcfService1.IService1">
Step 5: Call the 2 Services in One Transaction
Now that we are done with enabling our server side transaction, it’s time to call the above 2 services in 1 transaction. We need to use the TransactionScope
object to group the above 2 WCF services in one transaction. To commit all the WCF transactions, we call the Complete
method of the Transactionscope
object. To rollback, we need to call the Dispose
method.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
// Call your webservice transactions here
ts.Complete();
}
catch (Exception ex)
{
ts.Dispose();
}
}
Below is the complete code snippet in which we have grouped both the WCF transactions in one scope as shown below:
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
obj.UpdateData();
ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
obj1.UpdateData();
ts.Complete();
}
catch (Exception ex)
{
ts.Dispose();
}
}
Step 6: Test If Your Transaction Works
It’s time to test if the transactions really work. We are calling two services, both of which are doing an insert. After the first WCF service call, we are forcing an exception. In other words, the data insert of the first WCF service should revert back. If you check the database records, you will see no records are inserted by the WCF service.
History
- 6th August, 2009: Initial post
- Can I update this article? It's not mine!
For further reading do watch the below interview preparation videos and step by step video series.