从零开始学WCF(13)事务

WCF事务概述及事务模型

事务提供一种分组方法,将一组操作分为单个不可分的执行单元。事务是指具有下列属性的操作集合:

1) 原子性:此属性可确保特定事务下完成的所有更新都已提交并保持持久,或所有这些更新都已终止并回滚到其先前状态。

2) 一致性:此属性可保证某一事务下所做的更改表示从一种一致状态转换到另一种一致状态。例如,将钱从支票账户转移到存款账户的事务并不改变整个银行账户中的钱的总额。

3) 隔离:此属性可防止事务遵循属于其他并发事务的未提交的更改。隔离在确保一种事务不能对另一种事务的执行产生意外的影响的同时,还提供一个抽象的并发。不同的事务不能互相交叉影响同一个数据。

4) 持续性: 这意味着一旦提交对托管资源(如数据库记录)的更新,即使出现失败这些更新也会保持持久。


在WCF中使用事务时,需要了解的一点是,并不是在不同事务模型之间进行选择,而是在一个集成化且一致的模型的不同层上进行操作。

三个主要事务组件:

1) WCF事务

使用WCF中的事务支持可以编写事务性服务。此外,借助于它对WS-AtomicTransaction(WS-AT)协议的支持,应用程序可以将事务流式传输到使用WCF或第三方技术生成的Web服务。

WCF服务或应用程序中,WCF事务功能提供了一些属性和配置,用于以声明方式指定基础结构应当创建、流式传输和同步事务的方式和时间。

2) System.Transactions事务

System.Transactions命名空间同事提供了一个基于Transaction类的显示编程模型和一个使用TransactionScope类的隐式编程模型(在此模型中,基础结构自动管理事务)。

3) MSDTC事务

Microsoft Distributed Transaction Coordinator(MSDTC)是一个事务管理器,它为分布式事务提供支持。


WCF在以下三个标准System.ServiceModel属性(Attribute)上提供用于配置WCF服务的事务行为的属性(Property)。

1) TransactionFlowAttribute

该属性指定服务协定中的操作是否愿意接受来自客户端的传入事务。此属性(Attribute)通过以下属性(Property)提供此控制:事务使用TransactionFlowOption枚举指定传入事务是Mandatory、Allowed还是NotAllowed。

此属性是将服务操作和与客户端的外部互操作相关的唯一属性。

2) ServiceBehaviorAttribute

该属性是指定服务协定实现的内部执行结果。
TransactionAutoCompleteOnSessionClose:该属性指定会话关闭时是否完成未完成的事务。此属性的默认值为false。如果此属性为true且传入会话正常关闭而不是由于网络或客户端故障而关闭,则会成功完成任何未完成的事务。否则,如果此属性为false或者如果会话未正常关闭,则会话关闭时任何未完成的事务将会回滚。如果此属性为true,则传入通道必须基于会话。
ReleaseServiceInstanceOnTransactionComple:此属性指定事务完成时是否释放基础服务实例。此属性的默认值为true。下一个入站消息会导致创建新的基础实例,放弃上一个实例可能保持的每个事务的任何状态。释放服务实例是服务执行的内部操作对客户端可能已经建立的任何现有连接或会话没有影响。此功能等效于COM+提供的实时激活功能。如果此属性为true,则ConcurrencyMode必须等于Single。否则,服务在启动的过程中会引发无效配置验证异常。
TransactionIsolationLevel:此属性指定用于服务内事务的隔离级别;此属性采用IsolationLevel值之一。如果本地隔离级别属性是Unspecified以外的任何值,则传入事务的隔离级别必须与本地属性的设置相匹配。否则会拒绝传入事务并将故障发回客户端。如果TransactionScopeRequired为true,且没有对事务进行流处理,则此属性确定要用于本地创建的事务Isolation值。如果IsolationLevel设置为Unspecified,则使用IsolationLevelSerializable。
TransactionTimeout:此属性指定一个时间段,在服务中创建的新事务必须在此时间段内完成。如果达到此时间时事务没有完成,则会中止事务。对于已经达到TransactionScopeRequired设置为true的任何操作以及为其创建了新事务的任何操作,TimSpan用作TransactionScope超时。该超时是从创建事务到完成两阶段提交协议的第一阶段所允许的最长时间。使用的超时值始终是TransactionTimeout属性和transactionTimeout配置设置之间的较小值。

3) OperationBehaviorAttribute

该属性指定服务实现中方法的行为。
TransactionScopeRequired:指定是否必须在活动范围内执行方法。默认为false。如果没有为方法设置OperationBehaviorAttribute属性,这也暗示着不会在事务中执行该方法。
如果操作需要事务范围,则从下列各项之一中派生该事务的源:
1) 如果客户端流动事务,则在使用该分布式事务创建的事务范围内执行此方法。
2) 使用排队传输时,使用用于对消息取消排队的事务。请注意,使用的事务不是流事务,因为它不是由消息的原始发送方提供。
3) 自定义传输尅通过TransportTransactionProperty提供事务。
4) 如果上面的任一属性均没有为事务提供外部源,则会在调用方法之前创建一个新的Transaction实例。

TransactionAutoComplete:指定在没有引发未处理的异常的情况下,在其中执行方法的事务是否自动完成。如果此属性为true,则当用户方法在未引发异常的情况下返回时,调用基础结构会自动将事务标记为“已完成”。如果此属性为false,则事务会附加到实例,并且仅当客户端调用标记为此属性等于true的后续方法时,或仅当后续方法显示调用SetTransactionComplete时,事务才会标记为“已完成”。不执行这两种方案之一会导致事务永远也不会处于“已完成”状态,其中所包含的工作也不会提交,除非将TransactionAutoCompleteOnSessionClose属性设置为true。如果此属性设置为true,则必须与会话一起使用通道,且必须将InstanceContextMode设置为PerSession。

DEMO

1) 使用自承载来创建一个WCF服务,新建一个Windows Console Application,然后添加WCF服务——CalculatorService,生成的WCF接口类ICalculatorService里输入:
using System;
using System.Collections.Generic;
using System.Linq;
using Sy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值