[WCF编程]12.事务:事务传播
一、事务传播概述
WCF可以跨越服务边界传递事务。这可以让服务参与到客户端事务里,客户端还可以在同一个事务里调用多个服务。客户端本身不一定是WCF服务。客户端事务是否传播到服务端可以通过绑定和操作契约契约的设置来控制。
我们把能够支持客户端事务传播给服务端的绑定称为“事务感知”型绑定。
只有TCP、IPC和WS绑定支持事务传播。
二、事务流与绑定
默认情况下,事务感知型绑定并不会传播事务。服务宿主或管理员必须明确设置服务接收进入的跨越组织或业务边界的事务。
为了支持事务传播。就必须在服务端和客户端绑定上明确设置允许传播事务。
所有的事务感知型绑定都提供了一个布尔型Transactionlow属性:
public class NetTcpBinding : Binding, IBindingRuntimePreferences
{
// 如果启用事务流,则为 true;否则为 false。默认值为 false。
[DefaultValue(false)]
public bool TransactionFlow { get; set; }
// ......
}为了启用事务传播,只需将属性设置为true即可。可以通过代码或配置文件进行设置。对于TCP绑定,如下:
代码:
NetTcpBinding binding=new NetTcpBinding();
binding.TransactionFlow=true;配置文件:
<netTcpBinding>
<binding transactionFlow="true" />
</netTcpBinding>严格来说,事务不需要启用可靠消息。事务会依赖自己的机制实现可靠性。但是,启用可靠性会降低事务中断的可能性,它会尽量保证通信可靠,这意味着事务不大可能因为通信问题而中断。因此,最佳做法就是在NetTcpBinding和WsHttpBinding支持事务的时候,启用可靠性传输。
<netTcpBinding>
<binding transactionFlow="true">
<reliableSession enabled="true"/>
</binding>
</netTcpBinding>
二、事务流与契约操作
使用事务感知型绑定并启用事务流,并不意味着服务想在每个操作里使用客户端事务或客户端让事务优先传播。
这种服务级别的决策应该是客户端 与服务端之间协商约定的一部分。因此,WCF提供了TransactionFlowAttribute属性,它可以控制客户端事务是否传播给服务端。
public sealed class TransactionFlowAttribute : Attribute, IOperationBehavior
{
public TransactionFlowAttribute(TransactionFlowOption transactions);</span><span style="color: #008000">//</span><span style="color: #008000"> 一个 System.ServiceModel.TransactionFlowOption,指示是否支持传入事务。</span>
<span style="color: #0000ff">public</span> TransactionFlowOption Transactions { <span style="color: #0000ff">get</span><span style="color: #000000">; }
}
public enum TransactionFlowOption
{
// 事务不应成为流。这是默认值。
NotAllowed = 0,</span><span style="color: #008000">//</span><span style="color: #008000"> 事务可以成为流。</span>
Allowed = <span style="color: #800080">1</span><span style="color: #000000">, </span><span style="color: #008000">//</span><span style="color: #008000"> 事务必须成为流。</span>
Mandatory = <span style="color: #800080">2</span><span style="color: #000000">,
}
注意,TransactionFlow属性标记在方法层级上,因为WCF坚持事务流应该在操作级别决定,而不是在服务级别决定:
public class MyService : IMyService
{
[TransactionFlow(TransactionFlowOption.Allowed)]
public void MyMethod()
{ }
}这是为了达到方法级别参与客户端事务的粒度而精心设计的。
TransactionFlow属性会包含在服务发布的元数据中,所以当你引用服务契约定义时,定义将会包含这个TransactionFlow值。WCF将会让你在服务端实现的操作时上应用TransactionFlow属性:
[ServiceContract]
public interface IMyService
{
[OperationContract]
void MyMethod();
} public class MyService : IMyService
{
[TransactionFlow(TransactionFlowOption.Allowed)]
public void MyMethod()
{ }
}但是,这种用法并不值得鼓励,因为它会分割即将发布的逻辑服务契约定义代码。
TransactionFlowOption.NotAllowed
禁止参与事务。
当操作配置为禁止传播事务流时,客户端不能传播到服务端。即使客户端发起一个事务且绑定允许传播,服务也会忽略事务流。服务永远不会使用客户端事务,且服务和客户端可以选择任意绑定并使用任意配置。TransactionFlowOption.NotAllowed是TransactionFlowOption的默认值。
TransactionFlowOption.Allowed
允许参与事务,如果调用方启用了事务,则参与。
当操作配置为允许传播事务时,如果客户端包含事务,服务将允许跨越边界传播客户端事务。但是,即使客户端传播了事务,服务也不一定必须使用这个事务。当使用TransactionFlowOption.Allowed时,服务可以配置使用任意绑定。无论是否为事务感知型绑定都可以,但是客户端与服务端绑定配置要兼容。当服务端绑定配置了允许事务流时,客户端可以传播也可以不传播事务。
TransactionFlowOption.Mandatory
强制参与事务,调用方必须启用事务才能调用本服务。
当操作配置为TransactionFlowOption.Mandatory时,服务和客户端必须使用事务感知型绑定,并启用事务传播。WCF会在服务加载是校验这些设置。对于强制事务流,客户端事务会一致传播给服务。但是 ,服务可以选择参与或不参与客户端事务。
ServiceBehaviorAttribute
描述服务参与事务的一些参数。
- TransactionAutoCompleteOnSessionClose = bool:指示当会话(Session)结束时是否自动提交事务(Complete); 这个属性和服务对象实例模式紧密相关,使用的时候,应该着重小心。
- ReleaseServiceInstanceOnTransactionComplete = bool:指示事务提交后是否释放服务实例对象;
TransactionIsolationLevel= System.Transactions.IsolationLevel:用于指示事务隔离级别。- OperationBehaviorAttribute:描述契约方法如何参与事务的一些参数
- TransactionScopeRequired = bool:该属性是 WCF 分布事务所必需的。它表明服务方法必须在事务范围(transaction scope)内执行。如果不添加该标记,则意味着服务方法不参与到事务中。
- TransactionAutoComplete = bool: 指示方法正常结束后是否自动提交事务。
三、单调
客户端可以传播事务到 服务端,当然也允许服务端根据需要终止客户端。但是,在单调操作中,客户端无法传递事务流到客户端,因为调用消息不包含应答消息。
[ServiceContract]
public interface IMyService
{
[OperationContract(IsOneWay=true)]
[TransactionFlow(TransactionFlowOption.Allowed)] //错误操作
void MyMethod();
}
[WCF编程]12.事务:事务传播的更多相关文章
- [WCF编程]12.事务:服务事务编程(下)
一.投票与提交 虽然WCF负责事务传播及两阶段提交协议的管理工作,但是 她不知道事务是否应该提交或终止.这需要根服务告诉WCF应该何时启动两阶段提交协议.是提交还是终止.WCF提供了两种编程模式来对事 ...
- [WCF编程]12.事务:事务协议与管理器
一.事务协议 总体来说,WCF开发人员不需要涉及事务协议与管理器.我们应该依赖WCF来选择相应的事务协议和管理器,重点关注业务逻辑的实现. WCF是根据事务范围里的参与个体来选择事务管理协议的.事务管 ...
- [WCF编程]12.事务:服务事务编程(上)
一.设置环境事务 默认情况下,服务类和操作没有环境事务,即使客户端事务传播到服务端也是如此. 尽管强制事务流从客户端传播过来,但服务端的环境事务依旧为null.为了启用环境事务,每个操作必须告诉WCF ...
- [WCF编程]12.事务:Transaction类
一.概述 .NET2.0在命名空间System.Transactions下提供了Transaction类,它表示所有.NET事务管理器使用的事务. [Serializable]public class ...
- [WCF编程]12.事务:事务概述
一.事务概述 维护系统一致性和正确地处理错误恢复挑战的最佳方式是使用事务. 一个事务就是一个复杂操作的集合,这个集合中任何一个操作的失败都会引起整个集合的失败. 尽管在事务进行时系统被允许暂时出于不一 ...
- WCF学习笔记之事务编程
WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...
- Spring事务的传播行为 @Transactional
Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...
- spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析
知识点梳理 课堂讲义 1)事务回顾 1.1)什么是事务-视频01 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败. 1.2)事务的作用 事务特征(ACID) 原子 ...
- Spring事务的传播行为 @Transactional(转)
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
随机推荐
- Android学习——windows下搭建Cygwin环境
在上一篇博文<Android学习——windows下搭建NDK_r9环境>中,我们详细的讲解了在windows下进行Android NDK开发环境的配置,我们也讲到了在NDk r7以后,我 ...
- MyEclipse打开 HTML 报错Failed to create the part's controls
拷贝代码时有时会弹出这个错误,页面仍然可以访问,但是无法编辑很郁闷. MyEclipse默认打开编辑页面是MyEclipse visual html designer 右击html页面选择open ...
- CentOS 7 网络配置
Virtual box 安装了CentOS 7最小模式后马上用ifconfig命令查看网络情况,发现该命令不存在. [root@centos1 ~]# ifconfig -bash: ifconfig ...
- 有关bootstrap
最近在接触对移动浏览器很友好的bootstrap,遂整理了一点笔记: 简单的html页面: <!DOCTYPE html><html> <head> <tit ...
- PHP 基础知识测试题 答案分析
一:选择题(单项选择,每题2分): 1. LAMP具体结构不包含下面哪种(A ) A:Windows系统 如果是这个就是WMP B:Apache服务器 C:MySQ ...
- WPF入门教程系列二十一——DataGrid示例(一)
前面我们学习了ListView控件的使用示例,今天我们来学习DataGrid的有关知识.提到DataGrid 不管是Asp.Net中的网页开发还是WinForm应用程序开发都会频繁使用.通过它我们可以 ...
- Python介绍
本节内容 Python简史 Python是一门什么样的语言? Python的优点与缺点 Python解释器 一.Python简史 历史背景 在20世纪80年代,IBM和苹果已经掀起了个人电脑的浪潮.但 ...
- Design6:选择合适的数据类型
数据库使用Table来存储海量的数据,细分Table结构,数据最终存储在Table Column中,因此,在设计Table Schema时,必须慎重选择Table Column的Data Type,数 ...
- Security6:授予权限的思路和一般步骤
思路是:Grants permissions on a securable to a principal. The general concept is to GRANT <some permi ...
- C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...