ServiceModel 事务属性

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

TransactionFlowAttribute

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

此属性是将服务操作和与客户端的外部交互操作相关联的唯一属性。下面几节中说明的属性与在操作的执行中使用的事务有关。

ServiceBehaviorAttribute

ServiceBehaviorAttribute 属性指定服务协定实现的内部执行行为。此属性 (Attribute) 的特定于事务的属性 (Property) 包括:

  • TransactionAutoCompleteOnSessionClose,此属性指定会话关闭时是否完成未完成的事务。此属性的默认值为 false。如果此属性为 true 且传入会话正常关闭而不是由于网络或客户端故障而关闭,则会成功完成任何未完成的事务。否则,如果此属性为 false 或者如果会话未正常关闭,则会话关闭时任何未完成的事务将会回滚。如果此属性为 true,则传入通道必须基于会话。

  • ReleaseServiceInstanceOnTransactionComplete,此属性指定事务完成时是否释放基础服务实例。此属性的默认值为 true。下一个入站消息会导致创建新的基础实例,放弃上一个实例可能保持的每个事务的任何状态。释放服务实例是服务执行的内部操作,对客户端可能已经建立的任何现有连接或会话没有影响。此功能等效于 COM+ 提供的实时激活功能。如果此属性为 true,则 ConcurrencyMode 必须等于 Single。否则,服务在启动过程中会引发无效配置验证异常。

  • TransactionIsolationLevel,此属性指定用于服务内事务的隔离级别;此属性采用 IsolationLevel 值之一。如果本地隔离级别属性是 Unspecified 以外的任何值,则传入事务的隔离级别必须与此本地属性的设置相匹配。否则会拒绝传入事务并将故障发回客户端。如果 TransactionScopeRequiredtrue,且没有对事务进行流处理,则此属性确定要用于本地创建的事务的 IsolationLevel 值。如果 IsolationLevel 设置为 Unspecified,则使用 IsolationLevel Serializable

  • TransactionTimeout,此属性指定一个时间段,在服务中创建的新事务必须在此时间段内完成。如果达到此时间时事务没有完成,则会中止事务。对于已将 TransactionScopeRequired 设置为 true 的任何操作以及为其创建了新事务的任何操作,TimeSpan 用作 TransactionScope 超时。该超时是从创建事务到完成两阶段提交协议的第 1 阶段所允许的最长时间。使用的超时值始终是 TransactionTimeout 属性和 transactionTimeout 配置设置之间的较小值。

OperationBehaviorAttribute

OperationBehaviorAttribute 属性指定服务实现中方法的行为。可以用此属性指示操作的特定执行行为。此属性 (Attribute) 的属性 (Property) 不影响服务协定的 Web 服务描述语言 (WSDL) 说明,它们只是用于启用通用功能的 WCF 编程模型元素,如果没有这些属性 (Property),开发人员将不得不自己实现这些功能。

此属性 (Attribute) 具有以下特定于事务的属性 (Property):

  • TransactionScopeRequired 指定是否必须在活动事务范围内执行方法。默认值为 false。如果没有为方法设置 OperationBehaviorAttribute 属性,这也暗示着不会在事务中执行该方法。如果操作不需要事务范围,则不会激活消息头中存在的任何事务,并且这些事务将保持作为 OperationContextIncomingMessageProperties 的元素。如果操作需要事务范围,则从下列各项之一中派生该事务的源:

    • 如果从客户端流动事务,则在使用该分布式事务创建的事务范围内执行此方法。

    • 使用排队传输时,使用用于对消息取消排队的事务。请注意,使用的事务不是流事务,因为它不是由消息的原始发送方提供。

    • 自定义传输可以通过使用 TransportTransactionProperty 提供事务。

    • 如果上面的任一属性均没有为事务提供外部源,则会在调用方法之前创建一个新的 Transaction 实例。

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