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

http://www.cnblogs.com/webabcd/archive/2008/06/24/1229049.html

 

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



作者:webabcd


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


示例
1、服务
Hello.cs

化零为整WCF(14) - 事务(Transaction) using  System;
化零为整WCF(14) - 事务(Transaction)
using  System.Collections.Generic;
化零为整WCF(14) - 事务(Transaction)
using  System.Linq;
化零为整WCF(14) - 事务(Transaction)
using  System.Text;
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)
using  System.ServiceModel;
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)
namespace  WCF.ServiceLib.Transaction
化零为整WCF(14) - 事务(Transaction)
{
化零为整WCF(14) - 事务(Transaction)    
/// <summary>
化零为整WCF(14) - 事务(Transaction)    
/// IHello接口
化零为整WCF(14) - 事务(Transaction)    
/// </summary>

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

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

化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)    
/// <summary>
化零为整WCF(14) - 事务(Transaction)    
/// Hello类
化零为整WCF(14) - 事务(Transaction)    
/// </summary>

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

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

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

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

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


Hi.cs

化零为整WCF(14) - 事务(Transaction) using  System;
化零为整WCF(14) - 事务(Transaction)
using  System.Collections.Generic;
化零为整WCF(14) - 事务(Transaction)
using  System.Linq;
化零为整WCF(14) - 事务(Transaction)
using  System.Text;
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)
using  System.ServiceModel;
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)
namespace  WCF.ServiceLib.Transaction
化零为整WCF(14) - 事务(Transaction)
{
化零为整WCF(14) - 事务(Transaction)    
/// <summary>
化零为整WCF(14) - 事务(Transaction)    
/// IHi接口
化零为整WCF(14) - 事务(Transaction)    
/// </summary>

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

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

化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)    
/// <summary>
化零为整WCF(14) - 事务(Transaction)    
/// Hi类
化零为整WCF(14) - 事务(Transaction)    
/// </summary>

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

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

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

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

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


Result.cs

化零为整WCF(14) - 事务(Transaction) using  System;
化零为整WCF(14) - 事务(Transaction)
using  System.Collections.Generic;
化零为整WCF(14) - 事务(Transaction)
using  System.Linq;
化零为整WCF(14) - 事务(Transaction)
using  System.Text;
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)
using  System.ServiceModel;
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)
namespace  WCF.ServiceLib.Transaction
化零为整WCF(14) - 事务(Transaction)
{
化零为整WCF(14) - 事务(Transaction)    
/// <summary>
化零为整WCF(14) - 事务(Transaction)    
/// 结果接口
化零为整WCF(14) - 事务(Transaction)    
/// </summary>

化零为整WCF(14) - 事务(Transaction)    [ServiceContract]
化零为整WCF(14) - 事务(Transaction)    
public interface IResult
化零为整WCF(14) - 事务(Transaction)    
{
化零为整WCF(14) - 事务(Transaction)        [OperationContract]
化零为整WCF(14) - 事务(Transaction)        List
<Item> GetResult();
化零为整WCF(14) - 事务(Transaction)    }

化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)    
/// <summary>
化零为整WCF(14) - 事务(Transaction)    
/// 结果类
化零为整WCF(14) - 事务(Transaction)    
/// </summary>

化零为整WCF(14) - 事务(Transaction)    public class Result : IResult
化零为整WCF(14) - 事务(Transaction)    
{
化零为整WCF(14) - 事务(Transaction)        
/// <summary>
化零为整WCF(14) - 事务(Transaction)        
/// 返回数据库结果
化零为整WCF(14) - 事务(Transaction)        
/// </summary>
化零为整WCF(14) - 事务(Transaction)        
/// <returns></returns>

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

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

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

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



2、宿主
Hello.svc

化零为整WCF(14) - 事务(Transaction) <% @ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Transaction.Hello"  %>


Hi.svc

化零为整WCF(14) - 事务(Transaction) <% @ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Transaction.Hi"  %>


Result.svc

化零为整WCF(14) - 事务(Transaction) <% @ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Transaction.Result"  %>


Web.config

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



3、客户端
Sample.aspx

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


Sample.aspx.cs

化零为整WCF(14) - 事务(Transaction) using  System;
化零为整WCF(14) - 事务(Transaction)
using  System.Collections;
化零为整WCF(14) - 事务(Transaction)
using  System.Configuration;
化零为整WCF(14) - 事务(Transaction)
using  System.Data;
化零为整WCF(14) - 事务(Transaction)
using  System.Linq;
化零为整WCF(14) - 事务(Transaction)
using  System.Web;
化零为整WCF(14) - 事务(Transaction)
using  System.Web.Security;
化零为整WCF(14) - 事务(Transaction)
using  System.Web.UI;
化零为整WCF(14) - 事务(Transaction)
using  System.Web.UI.HtmlControls;
化零为整WCF(14) - 事务(Transaction)
using  System.Web.UI.WebControls;
化零为整WCF(14) - 事务(Transaction)
using  System.Web.UI.WebControls.WebParts;
化零为整WCF(14) - 事务(Transaction)
using  System.Xml.Linq;
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)
using  System.Threading;
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)
public   partial   class  Transaction_Sample : System.Web.UI.Page
化零为整WCF(14) - 事务(Transaction)
{
化零为整WCF(14) - 事务(Transaction)    
protected void Page_Load(object sender, EventArgs e)
化零为整WCF(14) - 事务(Transaction)    
{
化零为整WCF(14) - 事务(Transaction)
化零为整WCF(14) - 事务(Transaction)    }

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

化零为整WCF(14) - 事务(Transaction)            
catch (Exception ex)
化零为整WCF(14) - 事务(Transaction)            
{
化零为整WCF(14) - 事务(Transaction)                lblErr.Text 
= ex.ToString();
化零为整WCF(14) - 事务(Transaction)            }

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

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

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

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


Web.config

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



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

你可能感兴趣的:(transaction)