Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Transactions in WCF

DZone's Guide to

Transactions in WCF

Free Resource

Download this comprehensive Mobile Testing Reference Guide to help prioritize which mobile devices and OSs to test against, brought to you in partnership with Sauce Labs.

Transaction plays an important role in any business application that involved CRUD operations. 
To implement transactions, we utilize TransactionScope class that automatically manages transactions and detect the scope of the transaction. You can apply TransactionScope on a block of code and regardless of how many WCF services instances you have opened or
operation contracts you are calling will be carried on the scope of that transaction.  For example, if you are calling three services methods and third one fails to complete the operation, transaction will be rolled back unless it’s outside the boundary of a TransactionScope.

WCF supports transaction on following bindings.

1.  WSHttpBinding

2.  NetTcpBinding

3.  NetNamedPipeBinding

4.  WSDualHttpBinding

5.  WSFederationHttpBinding

While developing a Service Contract you have to specify the TransactionFlow attribute on each
Operation Contracts that requires a Transaction to be handled. In the below code snippet there are two methods one which submit employee master information and the other that submits employee details. As both require transaction so I have specified TransactionFlow attribute on both of them.

        [OperationContract]
        [TransactionFlow(TransactionFlowOption.Allowed)]
        void CreateEmployee(Common.DataContracts.Employee employee);

        [OperationContract]
        [TransactionFlow(TransactionFlowOption.Allowed)]
        void SubmitEmployeeDetails(EmployeeDetails employeeDetails);

There are following flow options in the TransactionFlow attribute.

TransactionFlowOption. Allowed :Transaction can be flowed.

TransactionFlowOption.Mandatory: Transaction must be flowed.

TransactionFlowOption.NotAllowed: Transaction should not be flowed. This is default.

Next, implement the service and specify OperationBehavior  attribute on each method. You can specify the TransactionScopeRequired property as true or false.

[OperationBehavior(TransactionScopeRequired= true)]
public void CreateEmployee(Common.DataContracts.Employee employee){

}

Now enable the Transaction on the binding itself. Open your web.config file and specify the transactionflow = true as follows

<wsHttpBinding>
          <binding name="TransactionalBind" transactionFlow="true"/>      
</wsHttpBinding>

Now add service reference and consume the service. While calling CreateEmployee and SubmitEmployeeDetails method you have to put them in the TransactionScope block and if any of the method fails, the transaction will be rollback.

using (TransactionScope scope = new TransactionScope())
{
try
{

 Services.EmployeeService.EmployeeServiceClient()
  clientobj = new Services.EmployeeService.EmployeeServiceClient();

 clientobj.CreateEmployee(employeeObj);
 clientobj.CreateEmployeeDetails(employeeObjDetails);
 scope.Complete();
}
catch (Exception ex)
{
  scope.Dispose();

}
}

Happy Coding!



 







Analysts agree that a mix of emulators/simulators and real devices are necessary to optimize your mobile app testing - learn more in this white paper, brought to you in partnership with Sauce Labs.

Topics:

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}