介绍
WCF(Windows Communication Foundation) - 事务(Transaction):
    ·对契约方法 使用 TransactionFlowAttribute声明(设置TransactionFlowOption参 数 ),以指定服务操作的事务流策略
    ·对
服务方法是用OperationBehaviorAttribute 声明(设置TransactionScopeRequired 参数),以指定方法是否在事务范围(TransactionScope )内执行
    ·
配置host和client的binding节点的transactionFlow 属 性,以指定绑定是否支持流事务


示例
1、服务
Hello.cs

化零为整WCF(14) - 事务(Transaction)_xmlusing  System;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Collections.Generic;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Linq;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Text;
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
using  System.ServiceModel;
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
namespace  WCF.ServiceLib.Transaction
化零为整WCF(14) - 事务(Transaction)_默认值_09化零为整WCF(14) - 事务(Transaction)_xml_10
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14     
///  IHello接口
化零为整WCF(14) - 事务(Transaction)_c#_15     
///   </summary>

化零为整WCF(14) - 事务(Transaction)_c#_14    [ServiceContract]
化零为整WCF(14) - 事务(Transaction)_c#_14     
public   interface  IHello
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  打招呼方法
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   </summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   <param name="name"> 人名 </param>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   <remarks>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  TransactionFlow - 指定服务操作是否愿意接受来自客户端的传入事 务
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  NotAllowed - 禁止事务。默认值
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  Allowed - 允许事务
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  Mandatory - 强制事务
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   </remarks>
化零为整WCF(14) - 事务(Transaction)_c#_15         
///   <returns></returns>

化零为整WCF(14) - 事务(Transaction)_c#_14        [OperationContract]
化零为整WCF(14) - 事务(Transaction)_c#_14         [TransactionFlow(TransactionFlowOption.Mandatory)]
化零为整WCF(14) - 事务(Transaction)_c#_14         
void  WriteHello( string  name);
化零为整WCF(14) - 事务(Transaction)_c#_15     }

化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14     
///  Hello类
化零为整WCF(14) - 事务(Transaction)_c#_15     
///   </summary>

化零为整WCF(14) - 事务(Transaction)_c#_14     public   class  Hello : IHello
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  打招呼方法
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   </summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   <param name="name"> 人名 </param>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   <remarks>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  OperationBehavior - 指定服务方法的本地执行行为
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  1、TransactionScopeRequired - 如果方法需要事务范围 才能执行,则为 true;否则为 false。默认值为 false
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  将 TransactionScopeRequired 设置为 true,可以要 求操作在事务范围内执行。如果流事务可用,则操作会在该事务内执行。如果流事务不可用,则会创建一个新事务并使用它来执行操作
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  2、TransactionAutoComplete - 默认值为 true
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  true - 当方法完成执行时,将把该事务标志为完成(自动提交事务)
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  false - 需要调用 OperationContext.Current.SetTransactionComplete()方法来手工配置该事务的正确完成;否则,该事务将 被标志为失败(手动提交事务)
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   </remarks>
化零为整WCF(14) - 事务(Transaction)_c#_15         
///   <returns></returns>

化零为整WCF(14) - 事务(Transaction)_c#_14        [OperationBehavior(TransactionScopeRequired  =   true , TransactionAutoComplete  =   true )]
化零为整WCF(14) - 事务(Transaction)_c#_14         
public   void  WriteHello( string  name)
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14             DBDataContext ctx 
=   new  DBDataContext();
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14             ctx.Items.InsertOnSubmit(
化零为整WCF(14) - 事务(Transaction)_c#_14                 
new  Item
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13                 
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14                     Title 
=   string .Format( " Hello: {0}, TransactionId: {1} " , name, System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier),
化零为整WCF(14) - 事务(Transaction)_c#_14                     CreatedTime 
=  DateTime.Now
化零为整WCF(14) - 事务(Transaction)_c#_15                 }
);
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14             ctx.SubmitChanges();
化零为整WCF(14) - 事务(Transaction)_c#_15         }

化零为整WCF(14) - 事务(Transaction)_c#_15     }

化零为整WCF(14) - 事务(Transaction)_c#_79 }

化零为整WCF(14) - 事务(Transaction)_xml


Hi.cs

化零为整WCF(14) - 事务(Transaction)_xmlusing  System;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Collections.Generic;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Linq;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Text;
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
using  System.ServiceModel;
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
namespace  WCF.ServiceLib.Transaction
化零为整WCF(14) - 事务(Transaction)_默认值_09化零为整WCF(14) - 事务(Transaction)_xml_10
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14     
///  IHi接口
化零为整WCF(14) - 事务(Transaction)_c#_15     
///   </summary>

化零为整WCF(14) - 事务(Transaction)_c#_14    [ServiceContract]
化零为整WCF(14) - 事务(Transaction)_c#_14     
public   interface  IHi
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  打招呼方法
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   </summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   <param name="name"> 人名 </param>
化零为整WCF(14) - 事务(Transaction)_c#_15         
///   <returns></returns>

化零为整WCF(14) - 事务(Transaction)_c#_14        [OperationContract]
化零为整WCF(14) - 事务(Transaction)_c#_14         [TransactionFlow(TransactionFlowOption.Mandatory)]
化零为整WCF(14) - 事务(Transaction)_c#_14         
void  WriteHi( string  name);
化零为整WCF(14) - 事务(Transaction)_c#_15     }

化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14     
///  Hi类
化零为整WCF(14) - 事务(Transaction)_c#_15     
///   </summary>

化零为整WCF(14) - 事务(Transaction)_c#_14     public   class  Hi : IHi
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  打招呼方法
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   </summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   <param name="name"> 人名 </param>
化零为整WCF(14) - 事务(Transaction)_c#_15         
///   <returns></returns>

化零为整WCF(14) - 事务(Transaction)_c#_14        [OperationBehavior(TransactionScopeRequired  =   true , TransactionAutoComplete  =   true )]
化零为整WCF(14) - 事务(Transaction)_c#_14         
public   void  WriteHi( string  name)
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14             
if  (DateTime.Now.Second  %   2   ==   0 )
化零为整WCF(14) - 事务(Transaction)_c#_14                 
throw   new  System.Exception( " 为测试事务而抛出的异常 " );
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14             DBDataContext ctx 
=   new  DBDataContext();
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14             ctx.Items.InsertOnSubmit(
化零为整WCF(14) - 事务(Transaction)_c#_14                 
new  Item
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13                 
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14                     Title 
=   string .Format( " Hi: {0}, TransactionId: {1} " , name, System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier),
化零为整WCF(14) - 事务(Transaction)_c#_14                     CreatedTime 
=  DateTime.Now
化零为整WCF(14) - 事务(Transaction)_c#_15                 }
);
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14             ctx.SubmitChanges();
化零为整WCF(14) - 事务(Transaction)_c#_15         }

化零为整WCF(14) - 事务(Transaction)_c#_15     }

化零为整WCF(14) - 事务(Transaction)_c#_79 }

化零为整WCF(14) - 事务(Transaction)_xml


Result.cs

化零为整WCF(14) - 事务(Transaction)_xmlusing  System;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Collections.Generic;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Linq;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Text;
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
using  System.ServiceModel;
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
namespace  WCF.ServiceLib.Transaction
化零为整WCF(14) - 事务(Transaction)_默认值_09化零为整WCF(14) - 事务(Transaction)_xml_10
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14     
///  结果接口
化零为整WCF(14) - 事务(Transaction)_c#_15     
///   </summary>

化零为整WCF(14) - 事务(Transaction)_c#_14    [ServiceContract]
化零为整WCF(14) - 事务(Transaction)_c#_14     
public   interface  IResult
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14         [OperationContract]
化零为整WCF(14) - 事务(Transaction)_c#_14         List
< Item >  GetResult();
化零为整WCF(14) - 事务(Transaction)_c#_15     }

化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14     
///  结果类
化零为整WCF(14) - 事务(Transaction)_c#_15     
///   </summary>

化零为整WCF(14) - 事务(Transaction)_c#_14     public   class  Result : IResult
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
/**/ ///   <summary>
化零为整WCF(14) - 事务(Transaction)_c#_14         
///  返回数据库结果
化零为整WCF(14) - 事务(Transaction)_c#_14         
///   </summary>
化零为整WCF(14) - 事务(Transaction)_c#_15         
///   <returns></returns>

化零为整WCF(14) - 事务(Transaction)_c#_14         public  List < Item >  GetResult()
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14             DBDataContext ctx 
=   new  DBDataContext();
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14             var result 
=  from l  in  ctx.Items
化零为整WCF(14) - 事务(Transaction)_c#_14                          orderby l.CreatedTime descending
化零为整WCF(14) - 事务(Transaction)_c#_14                          select l;
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14             
return  result.ToList();
化零为整WCF(14) - 事务(Transaction)_c#_15         }

化零为整WCF(14) - 事务(Transaction)_c#_15     }

化零为整WCF(14) - 事务(Transaction)_c#_79 }

化零为整WCF(14) - 事务(Transaction)_xml



2、宿主
Hello.svc

化零为整WCF(14) - 事务(Transaction)_默认值_09化零为整WCF(14) - 事务(Transaction)_xml_10<% 化零为整WCF(14) - 事务(Transaction)_c#_11 @ ServiceHost Language = " C# "  Debug = " true "  Service = " WCF.ServiceLib.Transaction.Hello "   %>


Hi.svc

化零为整WCF(14) - 事务(Transaction)_默认值_09化零为整WCF(14) - 事务(Transaction)_xml_10<% 化零为整WCF(14) - 事务(Transaction)_c#_11 @ ServiceHost Language = " C# "  Debug = " true "  Service = " WCF.ServiceLib.Transaction.Hi "   %>


Result.svc

化零为整WCF(14) - 事务(Transaction)_默认值_09化零为整WCF(14) - 事务(Transaction)_xml_10<% 化零为整WCF(14) - 事务(Transaction)_c#_11 @ ServiceHost Language = " C# "  Debug = " true "  Service = " WCF.ServiceLib.Transaction.Result "   %>


Web.config

化零为整WCF(14) - 事务(Transaction)_xml<? xml version="1.0" ?>
化零为整WCF(14) - 事务(Transaction)_xml
< configuration >
化零为整WCF(14) - 事务(Transaction)_xml     
< system.serviceModel >
化零为整WCF(14) - 事务(Transaction)_xml         
< behaviors >
化零为整WCF(14) - 事务(Transaction)_xml             
< serviceBehaviors >
化零为整WCF(14) - 事务(Transaction)_xml                 
< behavior  name ="TransactionBehavior" >
化零为整WCF(14) - 事务(Transaction)_xml                     
<!-- httpGetEnabled - 指 示是否发布服务元数据以便使用 HTTP/GET 请求进行检索,如果发布 WSDL,则为 true,否则为 false,默认值为 false -->
化零为整WCF(14) - 事务(Transaction)_xml                     
< serviceMetadata  httpGetEnabled ="true"   />
化零为整WCF(14) - 事务(Transaction)_xml                     
< serviceDebug  includeExceptionDetailInFaults ="true" />
化零为整WCF(14) - 事务(Transaction)_xml                 
</ behavior >
化零为整WCF(14) - 事务(Transaction)_xml             
</ serviceBehaviors >
化零为整WCF(14) - 事务(Transaction)_xml         
</ behaviors >
化零为整WCF(14) - 事务(Transaction)_xml         
< services >
化零为整WCF(14) - 事务(Transaction)_xml             
<!-- name - 提供服务的类名 -->
化零为整WCF(14) - 事务(Transaction)_xml             
<!-- behaviorConfiguration - 指定相关的行为配置 -->
化零为整WCF(14) - 事务(Transaction)_xml             
< service  name ="WCF.ServiceLib.Transaction.Hello"  behaviorConfiguration ="TransactionBehavior" >
化零为整WCF(14) - 事务(Transaction)_xml                 
<!-- address - 服务地址 -->
化零为整WCF(14) - 事务(Transaction)_xml                 
<!-- binding - 通信方式 -->
化零为整WCF(14) - 事务(Transaction)_xml                 
<!-- contract - 服务契约 -->
化零为整WCF(14) - 事务(Transaction)_xml                 
<!-- bindingConfiguration - 指定相关的绑定配置 -->
化零为整WCF(14) - 事务(Transaction)_xml                 
< endpoint  address =""  binding ="wsHttpBinding"  contract ="WCF.ServiceLib.Transaction.IHello"  bindingConfiguration ="TransactionConfiguration"   />
化零为整WCF(14) - 事务(Transaction)_xml             
</ service >
化零为整WCF(14) - 事务(Transaction)_xml             
< service  name ="WCF.ServiceLib.Transaction.Hi"  behaviorConfiguration ="TransactionBehavior" >
化零为整WCF(14) - 事务(Transaction)_xml                 
< endpoint  address =""  binding ="wsHttpBinding"  contract ="WCF.ServiceLib.Transaction.IHi"  bindingConfiguration ="TransactionConfiguration"   />
化零为整WCF(14) - 事务(Transaction)_xml             
</ service >
化零为整WCF(14) - 事务(Transaction)_xml             
< service  name ="WCF.ServiceLib.Transaction.Result"  behaviorConfiguration ="TransactionBehavior" >
化零为整WCF(14) - 事务(Transaction)_xml                 
< endpoint  address =""  binding ="basicHttpBinding"  contract ="WCF.ServiceLib.Transaction.IResult"   />
化零为整WCF(14) - 事务(Transaction)_xml             
</ service >
化零为整WCF(14) - 事务(Transaction)_xml         
</ services >
化零为整WCF(14) - 事务(Transaction)_xml         
< bindings >
化零为整WCF(14) - 事务(Transaction)_xml             
< wsHttpBinding >
化零为整WCF(14) - 事务(Transaction)_xml                 
<!-- transactionFlow - 指定该绑定是否应支持流事务 -->
化零为整WCF(14) - 事务(Transaction)_xml                 
< binding  name ="TransactionConfiguration"  transactionFlow ="true"   />
化零为整WCF(14) - 事务(Transaction)_xml             
</ wsHttpBinding >
化零为整WCF(14) - 事务(Transaction)_xml         
</ bindings >
化零为整WCF(14) - 事务(Transaction)_xml     
</ system.serviceModel >
化零为整WCF(14) - 事务(Transaction)_xml
</ configuration >
化零为整WCF(14) - 事务(Transaction)_xml



3、客户端
Sample.aspx

化零为整WCF(14) - 事务(Transaction)_默认值_09化零为整WCF(14) - 事务(Transaction)_xml_10<% 化零为整WCF(14) - 事务(Transaction)_c#_11 @ Page Language = " C# "  MasterPageFile = " ~/Site.master "  AutoEventWireup = " true "  CodeFile = " Sample.aspx.cs "
化零为整WCF(14) - 事务(Transaction)_c#_79     Inherits
= " Transaction_Sample "  Title = " 事务 (Transaction) "  
%>
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
< asp:Content  ID ="Content1"  ContentPlaceHolderID ="head"  runat ="Server" >
化零为整WCF(14) - 事务(Transaction)_xml
</ asp:Content >
化零为整WCF(14) - 事务(Transaction)_xml
< asp:Content  ID ="Content2"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
化零为整WCF(14) - 事务(Transaction)_xml     
< p >
化零为整WCF(14) - 事务(Transaction)_xml         
< asp:Label  ID ="lblErr"  runat ="server"  ForeColor ="Red"   />
化零为整WCF(14) - 事务(Transaction)_xml     
</ p >
化零为整WCF(14) - 事务(Transaction)_xml     
< p >
化零为整WCF(14) - 事务(Transaction)_xml         
< asp:Button  ID ="btnSubmit"  runat ="server"  Text ="事务测试"  OnClick ="btnSubmit_Click"   />
化零为整WCF(14) - 事务(Transaction)_xml         
< br  />
化零为整WCF(14) - 事务(Transaction)_xml         
< br  />
化零为整WCF(14) - 事务(Transaction)_xml         
< asp:GridView  ID ="GridView1"  runat ="server" >
化零为整WCF(14) - 事务(Transaction)_xml         
</ asp:GridView >
化零为整WCF(14) - 事务(Transaction)_xml     
</ p >
化零为整WCF(14) - 事务(Transaction)_xml     
< p >
化零为整WCF(14) - 事务(Transaction)_xml         2PC(Two Phase Commitment Protocol)两阶段提交协议(WCF的事务的实现基 于此协议)
化零为整WCF(14) - 事务(Transaction)_xml         
< br  />
化零为整WCF(14) - 事务(Transaction)_xml         实现分布式事务的关键就是两阶段提交协议。在此协议中,一个或多个资源管理器的活动均由一个称为事务协调器的单 独软件组件来控制。此协议中的五个步骤如下:
化零为整WCF(14) - 事务(Transaction)_xml         
< br  />
化零为整WCF(14) - 事务(Transaction)_xml         1、应用程序调用事务协调器中的提交方法。
化零为整WCF(14) - 事务(Transaction)_xml         
< br  />
化零为整WCF(14) - 事务(Transaction)_xml         2、事务协调器将联络事务中涉及的每个资源管理器,并通知它们准备提交事务(这是第一阶段的开始)。
化零为整WCF(14) - 事务(Transaction)_xml         
< br  />
化零为整WCF(14) - 事务(Transaction)_xml         3、为 了以肯定的方式响应准备阶段,资源管理器必须将自己置于以下状态:确保能在被要求提交事务时提交事务, 或在被要求回滚事务时回滚事务。大多数资源管理器会将包含其计划更改的日记文件(或等效文件)写入持久存储区中。如果资源管理器无法准备事务,它会以一个 否定响应来回应事务协调器。
化零为整WCF(14) - 事务(Transaction)_xml         
< br  />
化零为整WCF(14) - 事务(Transaction)_xml         4、事务协调器收集来自资源管理器的所有响应。
化零为整WCF(14) - 事务(Transaction)_xml         
< br  />
化零为整WCF(14) - 事务(Transaction)_xml         5、在 第二阶段,事务协调器将事务的结果通知给每个资源管理器。如果任一资源管理器做出否定响应,则事务协调 器会将一个回滚命令发送给事务中涉及的所有资源管理 器。如果资源管理器都做出肯定响应,则事务协调器会指示所有的资源管理器提交事务。一旦通知资源管理 器提交,此后的事务就不能失败了。通过以肯定的方式响应第一阶段,每个资源管理器均已确保,如果以后通知它提交事务,则事务不会失败。
化零为整WCF(14) - 事务(Transaction)_xml     
</ p >
化零为整WCF(14) - 事务(Transaction)_xml
</ asp:Content >
化零为整WCF(14) - 事务(Transaction)_xml


Sample.aspx.cs

化零为整WCF(14) - 事务(Transaction)_xmlusing  System;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Collections;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Configuration;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Data;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Linq;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Web;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Web.Security;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Web.UI;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Web.UI.HtmlControls;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Web.UI.WebControls;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Web.UI.WebControls.WebParts;
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Xml.Linq;
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
using  System.Threading;
化零为整WCF(14) - 事务(Transaction)_xml
化零为整WCF(14) - 事务(Transaction)_xml
public   partial   class  Transaction_Sample : System.Web.UI.Page
化零为整WCF(14) - 事务(Transaction)_默认值_09化零为整WCF(14) - 事务(Transaction)_xml_10
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14     
protected   void  Page_Load( object  sender, EventArgs e)
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_15     }

化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14     
protected   void  btnSubmit_Click( object  sender, EventArgs e)
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13     
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14         var proxyHello 
=   new  TransactionSvc.Hello.HelloClient();
化零为整WCF(14) - 事务(Transaction)_c#_14         var proxyHi 
=   new  TransactionSvc.Hi.HiClient();
化零为整WCF(14) - 事务(Transaction)_c#_14         var proxyResult 
=   new  TransactionSvc.Result.ResultClient();
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14         System.Transactions.TransactionOptions to 
=   new  System.Transactions.TransactionOptions();
化零为整WCF(14) - 事务(Transaction)_c#_14         
//  设置事务的超时时间
化零为整WCF(14) - 事务(Transaction)_c#_14
        to.Timeout  =   new  TimeSpan( 0 0 30 );
化零为整WCF(14) - 事务(Transaction)_c#_14         
//  设置事务的隔离级别
化零为整WCF(14) - 事务(Transaction)_c#_14
        to.IsolationLevel  =  System.Transactions.IsolationLevel.Serializable;
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14         
using  (var ts  =   new  System.Transactions.TransactionScope())
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13         
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14             
try
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13             
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14                 proxyHello.WriteHello(
" webabcd " );
化零为整WCF(14) - 事务(Transaction)_c#_14                 proxyHello.Close();
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14                 proxyHi.WriteHi(
" webabcd " );
化零为整WCF(14) - 事务(Transaction)_c#_14                 proxyHi.Close();
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14                 ts.Complete();
化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14                 lblErr.Text 
=   " OK " ;
化零为整WCF(14) - 事务(Transaction)_c#_15             }

化零为整WCF(14) - 事务(Transaction)_c#_14             
catch  (Exception ex)
化零为整WCF(14) - 事务(Transaction)_xml_12化零为整WCF(14) - 事务(Transaction)_xml_13             
化零为整WCF(14) - 事务(Transaction)_c#_11 {
化零为整WCF(14) - 事务(Transaction)_c#_14                 lblErr.Text 
=  ex.ToString();
化零为整WCF(14) - 事务(Transaction)_c#_15             }

化零为整WCF(14) - 事务(Transaction)_c#_15         }

化零为整WCF(14) - 事务(Transaction)_c#_14
化零为整WCF(14) - 事务(Transaction)_c#_14         GridView1.DataSource 
=  proxyResult.GetResult();
化零为整WCF(14) - 事务(Transaction)_c#_14         GridView1.DataBind();
化零为整WCF(14) - 事务(Transaction)_c#_14         proxyHello.Close();
化零为整WCF(14) - 事务(Transaction)_c#_15     }

化零为整WCF(14) - 事务(Transaction)_c#_79 }

化零为整WCF(14) - 事务(Transaction)_xml


Web.config

化零为整WCF(14) - 事务(Transaction)_xml<? xml version="1.0" ?>
化零为整WCF(14) - 事务(Transaction)_xml
< configuration >
化零为整WCF(14) - 事务(Transaction)_xml     
< system.serviceModel >
化零为整WCF(14) - 事务(Transaction)_xml         
< client >
化零为整WCF(14) - 事务(Transaction)_xml             
<!-- address - 服务地址 -->
化零为整WCF(14) - 事务(Transaction)_xml             
<!-- binding - 通信方式 -->
化零为整WCF(14) - 事务(Transaction)_xml             
<!-- contract - 服务契约 -->
化零为整WCF(14) - 事务(Transaction)_xml             
< endpoint  address ="http://localhost:3502/ServiceHost/Transaction/Hello.svc"  binding ="wsHttpBinding"  contract ="TransactionSvc.Hello.IHello"  bindingConfiguration ="TransactionBindingConfiguration"   />
化零为整WCF(14) - 事务(Transaction)_xml             
< endpoint  address ="http://localhost:3502/ServiceHost/Transaction/Hi.svc"  binding ="wsHttpBinding"  contract ="TransactionSvc.Hi.IHi"  bindingConfiguration ="TransactionBindingConfiguration"   />
化零为整WCF(14) - 事务(Transaction)_xml             
< endpoint  address ="http://localhost:3502/ServiceHost/Transaction/Result.svc"  binding ="basicHttpBinding"  contract ="TransactionSvc.Result.IResult"   />
化零为整WCF(14) - 事务(Transaction)_xml         
</ client >
化零为整WCF(14) - 事务(Transaction)_xml         
< bindings >
化零为整WCF(14) - 事务(Transaction)_xml             
< wsHttpBinding >
化零为整WCF(14) - 事务(Transaction)_xml                 
<!-- transactionFlow - 指定该绑定是否应支持流事务 -->
化零为整WCF(14) - 事务(Transaction)_xml                 
< binding  name ="TransactionBindingConfiguration"  transactionFlow ="true"   />
化零为整WCF(14) - 事务(Transaction)_xml             
</ wsHttpBinding >
化零为整WCF(14) - 事务(Transaction)_xml         
</ bindings >
化零为整WCF(14) - 事务(Transaction)_xml     
</ system.serviceModel >
化零为整WCF(14) - 事务(Transaction)_xml
</ configuration >
化零为整WCF(14) - 事务(Transaction)_xml



运行结果:
单击"btnSubmit " 按钮后,可以发现,两个数据库插入操作,要么都执行,要么都不执行