Welcome

首页 / 软件开发 / WCF / WCF示例(14) - 事务(Transaction)

WCF示例(14) - 事务(Transaction)2012-01-20 webabcd 介绍

WCF(Windows Communication Foundation) - 事务(Transaction):

·对契约方法使用TransactionFlowAttribute声明(设置TransactionFlowOption参数),以指定服务操作的事务流策略

·对服务方法是用OperationBehaviorAttribute声明(设置TransactionScopeRequired参数),以指定方法是否在事务范围(TransactionScope)内执行

·配置host和client的binding节点的transactionFlow属性,以指定绑定是否支持流事务

示例

1、服务

Hello.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;  using System.ServiceModel;  namespace WCF.ServiceLib.Transaction{  /**//// <summary>  /// IHello接口  /// </summary>  [ServiceContract]  public interface IHello  {    /**//// <summary>    /// 打招呼方法    /// </summary>    /// <param name="name">人名</param>    /// <remarks>    /// TransactionFlow - 指定服务操作是否愿意接受来自客户端的传入事务    /// NotAllowed - 禁止事务。默认值    /// Allowed - 允许事务    /// Mandatory - 强制事务    /// </remarks>    /// <returns></returns>    [OperationContract]    [TransactionFlow(TransactionFlowOption.Mandatory)]    void WriteHello(string name);  }    /**//// <summary>  /// Hello类  /// </summary>  public class Hello : IHello  {    /**//// <summary>    /// 打招呼方法    /// </summary>    /// <param name="name">人名</param>    /// <remarks>    /// OperationBehavior - 指定服务方法的本地执行行为    /// 1、TransactionScopeRequired - 如果方法需要事务范围才能执行,则为 true;否则为 false。默认值为 false    /// 将 TransactionScopeRequired 设置为 true,可以要求操作在事务范围内执行。如果流事务可用,则操作会在该事务内执行。如果流事务不可用,则会创建一个新事务并使用它来执行操作    /// 2、TransactionAutoComplete - 默认值为 true    /// true - 当方法完成执行时,将把该事务标志为完成(自动提交事务)    /// false - 需要调用OperationContext.Current.SetTransactionComplete()方法来手工配置该事务的正确完成;否则,该事务将被标志为失败(手动提交事务)    /// </remarks>    /// <returns></returns>    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]    public void WriteHello(string name)    {      DBDataContext ctx = new DBDataContext();        ctx.Items.InsertOnSubmit(        new Item        {          Title = string.Format("Hello: {0}, TransactionId: {1}", name, System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier),          CreatedTime = DateTime.Now        });        ctx.SubmitChanges();    }  }}