[MSDN]WCF(13)事务
说明:本内容来自微软的webcast,讲师为徐长龙。为了用手机阅读方便点,抄录存为txt。
本次内容包括
- WCF 事务概述及事务模型
- WCF 中事务性支持
- 事务属性
- 事务配置
- 启用事务流
- COM+ 和 WCF 事务属性对比
WCF 事务概述及事务模型
- 事务可提供一种分组方法,将一组操作分为单个不可分的执行单元。事务值指具有下列属性的操作集合:
- 原子性。
- 此属性可确保特定事务下完成的所有更新都已提交并保持持久,或所有这些更新都已中止并回滚到先前状态。
- 一致性。
- 此属性可保证某一事务下所做的更改表示从一种一致状态转换到另一种一致状态。例如,将钱从支票账户转移到存款账户的事务并不改变整个银行账户中的钱的总额。
- 隔离性。
- 此属性可防止事务遵循于其他并发事务的未提交的更改。隔离在确保一种事务不能对另一事务的执行产生意外的影响的同时,还提供一个抽象的并发。
- 持续性。
- 这意味着一旦提交对托管资源(如数据库记录)的更新,即使出现失败,这些更新也会保持持久。
- 在 WCF 中使用事务时,需要了解一点是,您并不是在不同事务模型之间进行选择,而是在一个集成化且一致的模型的不同层上进行操作。
- 三个主要事务组件
- WCF 事务
- 使用 WCF 中的事务支持可以编写事务性服务。此外,借助于它对 WS-AtomicTransaction(WS-AT) 协议的支持,应用程序可以将事务流式传输到使用 WCF 或第三方技术生产的 Web 服务。
- WCF 服务或应用程序中, WCF 事务功能提供了一些属性和配置,用于以声明方式指定基础结构应当创建、流式传输和同步事务的方式和时间。
- System.Transactions 事务
- System.Transactions命名空间同时提供了一个基于 Transaction 类的显式编程模型和一个使用 TransactionScope 类的隐式编程模型(在此模型中,基础结构自动管理事务)。
- MSDTC 事务
- Microsoft Distributed Transaction Coordinator(MSDTC) 是一个事务管理器,它为分步式事务提供支持。
WCF 中事务属性
- WCF 在以下三个标准 System.ServiceModel 属性(attribute)上提供用于配置 WCF 服务的事务行为的属性(property)
- TransactionFlowAttribute
- ServiceBehaviorAttribute
- OperationBehaviorAttribute
- TransactionFlowAttribute
- TransactionFlowAttribute 属性指定服务协定中的操作是否愿意接受来自客户端的传入事务。此属性(attribute) 通过以下属性(property) 提供此控制:事务使用 TransactionFlowOption 枚举指定传入事务是 Mandatory ,Allowed 还是 NotAllowed。
- 此属性是将服务操作和客户端的外部交互操作相关联的唯一属性
- ServiceBehaviorAttribute
- ServiceBehaviorAttribute 属性指定服务协定实现的内部执行行为
- TransactionAutoCompleteOnSessionClose
- 此属性指定会话关闭时是否完成未完成的事务。此属性的默认值为false。如果此属性为true且传入会话正常关闭而不是由于网络或客户端故障而关闭,则会成功完成任何未完成的事务。否则,如果此属性为false或者如果会话未正常关闭,则会话关闭时任何未完成的事务将会回滚。如果此属性为true,则传入通道必须基于会话。
- ReleaseServiceInstanceOnTransactionComplete
- 此属性指定事务完成时是否释放基础服务实例。
- 此属性的默认值为true。下一个入站消息会导致创建新的基础实例,放弃上一个实例可能保持的每个事务的任何状态。释放服务实例是服务执行的内部操作,对客户端可能已经建立的任何现有连接或会话没有影响。此功能等效于 COM+ 提供的实时激活功能。如果此属性为true,则 ConcurrencyMode 必须等于 Single。否则,服务在启动过程中会引发无效配置验证异常。
- TransactionIsolationLevel
- 此属性指定用于服务内事务的隔离级别;此属性采用 IsolationLevel 值之一。
- 如果本地隔离级别属性是 Unspecified 以外的任何值,则传入事务的隔离级别必须与此本地属性的设置相匹配。否则会拒绝传入事务并将故障发回客户端。如果 TransactionScopeRequired 为 true,且没有对事务进行流处理,则此属性确定要用于本地创建的事务的 IsolationLevel 值。如果 IsolationLevel 设置为 Unspecified,则使用 IsolationLevel Serializable。
- TransactionTimeout
- 此属性指定一个时间段,在服务中创建的新事务必须在此时间段内完成。
- 如果达到此时间时事务没有完成,则会终止事务。
- 对于已将 TransactionScopeRequired 设置为 true 的任何操作以及为其创建了新事务的任何操作,TimeSpan 用作 TransactionScope 超时。该超时是从创建事务到完成两阶段提交协议的第1阶段所允许的最长时间。
- 使用的超时值始终是 TransactionTimeout 属性和 TransactionTimeout 配置设置之间的较小值。
- OperationBehaviorAttribute
- OperationBehaviorAttribute 属性指定服务实现中方法的行为
- TransactionScopeRequired
- 指定是否必须在活动事务范围内执行方法。默认值为 false。 如果没有为方法设置 OperationBehaviorAttribute 属性,这也暗示着不会在事务中执行该方法。
- 如果操作需要事务范围,则从销量各项之一中派生该事务的源:
- 如果从客户端流动事务,则在使用该分布式事务创建的事务范围内执行此方法。
- 使用排队传输时,使用用于对消息取消排队的事务。请注意,使用的事务不是流事务,因为它不是由消息的原始发送方提供。
- 自定义传输可以通过使用 TransportTransactionProperty 提供事务。
- 如果上面的任一属性均没有为事务提供外部源,则会在调用方法之前创建一个新的 Transaction 实例。
- TransactionAutoComplete
- 指定在没有引发未处理的异常的情况下,在其中执行方法的事务是否自动完成。
- 如果此属性为true,则当用户方法在未引发异常的情况下返回时,调用基础结构会自动将事务标记为”已完成“。
- 如果此属性为false,则事务会附加到实例,并且仅客户端调用标记为此属性等于true的后续方法是,或仅当后续方法显式调 SetTransactionComplete 时,事务才会标记为”已完成“。
- 不执行这两种方案之一会导致事务永远也不会处于”已完成“状态,其中所包含的工作也不会提交,除非将 TransactionAutoCompleteOnSessionClose 属性设置为true。如果此属性设置为true,则必须与会话一起使用通道,且必须将 InstanceContextMode 设置为 PerSession 。
WCF 中事务配置
- WCF 提供了以下三个用于为服务配置事务的属性:
transactionFlow, transactionProtocol 和 transactionTimeout
- 配置 transactionFlow
- WCF 提供的大多数预定义绑定都包含 transactionFlow 和 transactionProtocol 属性,以便您可要使用特定的事务流协议为特定终结点配置用于接受传入事务的绑定。
- transactionFlow 属性指定是否为使用绑定的服务终结点启用事务流。
- 配置 transactionProtocol
- transactionProtocol 属性指定要应用于使用绑定的服务终结点的事务协议。
- 下面是一个配置节示例,该配置将指定的绑定配置为支持事务流并且使用 WS-AtomicTransaction 协议。
<netNamePipeBinding>
<binding name="test"
closeTimeout="00:00:10"
openTimeout="00:00:20"
receiveTimeout="00:00:30"
sendTimeout="00:00:40"
transactionFlow="true"
transactionProtocol="WSAtomicTransactionOctober2004"
hostNameComparisonMode="WeakWildcard"
maxBufferSize="1001"
maxConnections="123"
maxReceivedMessageSize="1000">
</binding>
</netNamePipeBinding>
- 配置 transactionTimeout
<configuration>
<system.serviceModel>
<behaviors>
<behavior name="NewBehavior" transactionTimeout="00:01:00"/>
</behaviors>
</system.serviceModel>
</configuration>
启用事务流
- 服务终结点的事务流设置根据下列三个值的交集生成:
- 为服务协定中的每个方法指定的 TransactionFlowAttribute 属性。
- 特定绑定中的 TransactionFlow 绑定属性。
- 特定绑定中的 TransactionFlowProtocol 绑定属性。
TransactionFlowProtocol 绑定属性允许您在可用于流动事务的两个事务协议之间进行选择。后面几节将对这些协议逐一进行简要描述。
- WS-AtomicTransaction 协议
- WS-AtomicTransaction(WS-AT)协议要求第三方协议堆栈具有互操作性时的情形非常有用。
- OleTransactions 协议
- OleTransactions 协议对于如下的情形非常有用:即不要求第三方协议堆栈具有互操作性,并且服务部署人员预先知道 WS-AT 协议服务将在本地禁用或者现有网络拓扑不支持使用 WS-AT。
- 使用这些不同组合生成的不同类型的事务流
TransactionFlow绑定 TransactionFlow绑定属性 TransactionFlowProtocol绑定协议 事务流的类型
------------- ------------ --------------------------- ------------------------
Mandatory true WS-AT 事务必须以可以互操作的WS-AT 格式流动。
Mandatory true OleTransactions 事务必须以WCF OleTransactions 格式流动。
Mandatory false 不适用 不适用,因为这是无效的配置
Allowed true WS-AT 事务可以以可互操作的WS-AT 格式流动。
Allowed true OleTransactions 事务必须以WCF OleTransactions 格式流动。
Allowed false 任意值 不流动事务。
NotAllowed 任意值 任意值 不流动事务。
使用 ServiceModel 属性模拟 COM+
- 下表比较用于创建 EnterpriseServices 事务 TransactionOption 枚举,以及他们如何与 System.ServiceModel提供的WCF 属性关联。
COM+ 属性 WCF 属性
-------- ---------------------------------
RequiresNew TransactionFlowAttribute 设置为NotAllowed。
TransactionScopeRequired 为true。
绑定元素中的TransactionFlow 属性为false。
Required TransactionFlowAttribute 设置为Allowed。
TransactionScopeRequired 为true。
绑定元素中的TransactionFlow 属性为true。
Supported 没有直接等效项。通常,您应采用为Required指定的行为。
NotSupported TransactionScopeRequired 为false。
绑定元素中的TransactionFlow 属性为false。
Disabled 没有直接等效项。通常,您应采用为NotSupported 指定的行为。