none
请问既然已经在契约中声明了transactionflowoption.allowed,为什么还要设置transactionscoperequired=true? RRS feed

  • 问题

  • 契约中声明了就表明是使用事务了,那又何必在operationbehavior中设置transactionscoperequired?这样不是重复了吗?

    2009年10月13日 7:17

答案

  • 如果方法需要事务范围才能执行,则为 true;否则为 false。默认值为 false
    1.方法不在事务里执行
    2.这个取决于你的WCF事务模式,transactionflowoption = false,就是第三种模式了。不管客户端有没事务,服务端必须启动一个跟事务。
    下面是对应组合关系。你理解的时候考虑条件的组合问题。

    TransactionScopeRequired 设置为 true,可以要求操作在事务范围内执行。如果流事务可用,则操作会在该事务内执行。如果流事务不可用,则会创建一个新事务并使用它来执行操作。终结点中指定的绑定可以控制是否支持流事务。因此,若要获取正确的行为,您必须理解绑定是否允许事务流和 TransactionScopeRequired 属性之间的相互影响。下表显示可能的行为。

    TransactionScopeRequired

    绑定允许事务流

    调用方对事务进行流处理

    结果

    False

    False

    方法在没有事务的情况下执行。

    True

    False

    方法创建一个新事务,并在该事务内执行。

    True 或 False

    False

    事务标头返回 SOAP 错误。

    False

    True

    方法在没有事务的情况下执行。

    True

    True

    方法在流事务下执行。

    每种情况不一样
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月14日 4:51
    版主

全部回复

  • 你提到的WCF事务模式应该属于第一种。
    【5.1】. Client/Service transaction,最常见的一种事务模型,通常由客户端或服务本身启用一个事务。设置步骤:
    (1) 选择一个支持事务的Binding,设置 TransactionFlow = true。
    (2) 设置 TransactionFlow(TransactionFlowOption.Allowed)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    【5.2】. Client transaction,强制服务必须参与事务,而且必须是客户端启用事务。设置步骤:
    (1) 选择一个支持事务的Binding,设置 TransactionFlow = true。
    (2) 设置 TransactionFlow(TransactionFlowOption.Mandatory)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。
    【5.3】. Service transaction,服务必须启用一个根事务,且不参与任何外部事务。设置步骤:
    (1) 选择任何一种Binding,设置 TransactionFlow = false(默认)。
    (2) 设置 TransactionFlow(TransactionFlowOption.NotAllowed)。
    (3) 设置 OperationBehavior(TransactionScopeRequired=true)。

    即客户端启动事务的情况下,服务端要参与这个事务。
    TransactionFlow控制的事物传播的问题,即这个绑定要不要把客户端的事物流传递给服务端。
    transactionscoperequired控制的服务操作行为,即需要不需支持事务。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月13日 10:21
    版主
  • 那是不是表示就算契约接口方法设置transactionflowoption=allowed,如果方法设置为TransactionScopeRequired=false,那么也是不能使用事务的是吗?如果是这样又何必把方法接口设置为transactionflowoption=allowed?

    2009年10月14日 3:47
  • 如果方法需要事务范围才能执行,则为 true;否则为 false。默认值为 false
    1.方法不在事务里执行
    2.这个取决于你的WCF事务模式,transactionflowoption = false,就是第三种模式了。不管客户端有没事务,服务端必须启动一个跟事务。
    下面是对应组合关系。你理解的时候考虑条件的组合问题。

    TransactionScopeRequired 设置为 true,可以要求操作在事务范围内执行。如果流事务可用,则操作会在该事务内执行。如果流事务不可用,则会创建一个新事务并使用它来执行操作。终结点中指定的绑定可以控制是否支持流事务。因此,若要获取正确的行为,您必须理解绑定是否允许事务流和 TransactionScopeRequired 属性之间的相互影响。下表显示可能的行为。

    TransactionScopeRequired

    绑定允许事务流

    调用方对事务进行流处理

    结果

    False

    False

    方法在没有事务的情况下执行。

    True

    False

    方法创建一个新事务,并在该事务内执行。

    True 或 False

    False

    事务标头返回 SOAP 错误。

    False

    True

    方法在没有事务的情况下执行。

    True

    True

    方法在流事务下执行。

    每种情况不一样
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月14日 4:51
    版主