[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默认情况下会对运行期例 ...
随机推荐
- Linux环境下部署完JDK后运行一个简单的Java程序
前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...
- 剑指Offer面试题:26.字符串的排列
一.题目:字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 二 ...
- [Voice communications] 声道的转换
本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正! 很多粤语剧都提供了两个声道,一个左声道为粤语,一个右声道有国语 ...
- WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用
一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...
- chunkupload 文件上传断点续传组件(java) - 正式发布
chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. chunkupload实现如下功能: · 实现断点续传 · ...
- 玩转动态编译 - 高级篇:一,IL访问静态属性和字段
IL介绍 通用中间语言(Common Intermediate Language,简称CIL,发音为"sill"或"kill")是一种属于通用语言架构和.NET ...
- java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 严重: Exceptio ...
- SSISDB2:使用TSQL执行Package
在SSISDB中,能够使用TSQL脚本执行Package:每执行一次Package,SSIS都会创建一个Operation 和一个执行实例(Execution Instance),每个Executio ...
- mysql default unix_timestamp(now())
按照mssql的创建方式,去创建mysql的默认值时间戳是不能被允许的,例如下面代码: CREATE TABLE USERINFO( CREATETIME INT NOT NULL DEFAULT U ...
- sublime3破解版sublime3注册码
Sublime Text 3 官方网址:http://www.sublimetext.com/ Mac下载地址: http://c758482.r82.cf2.rackcdn.com/Sublime% ...