[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默认情况下会对运行期例 ...
随机推荐
- 认真分析mmap:是什么 为什么 怎么用
mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.实现这样的映射关系后,进程就可以采用指 ...
- 一起学习jQuery2.0.3源码—1.开篇
write less,do more jQuery告诉我们:牛逼的代码不仅精简而且高效! 2006年1月由美国人John Resig在纽约的barcamp发布了jQuery,吸引了来自世界各地众多Ja ...
- 微信为什么发布 Mac 版?
因为 Mac 就是好啊就是好啊,就是好…… 打完收工,谢谢,鼓掌 piapiapia……晚安! 这么写在京城行走会不会挨板砖呢?头像已经印到书上满世界的发出去了,虽然考虑到行走江湖求一个稳字,我还特意 ...
- Module-Zero之租户管理
返回<Module Zero学习目录> 开启多租户 租户实体 租户管理者 默认租户 开启多租户 ABP和Module-Zero可以运行多租户或单租户模式.多租户默认是禁用的.我们可以在mo ...
- spring快速入门(二)
一.在spring快速入门(一)的基础上,我们来了解spring是如何解决对象的创建以及对象之间的依赖关系的问题 (比如client中依赖UserAction的具体实现,UserActionImpl中 ...
- xamarin 手机顶部状态栏
修改显示xamarin开发的App的手机顶部状态栏, 步骤一:在项目UWP上的“引用”里右键“添加引用”,选择->Universal Windows->Windows Mobile Ext ...
- Java邮件发送与接收原理
一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...
- GitHub的使用记录
前言: 该贴为笔者在使用GItHub中的一些使用注意,及Git的基本命令,会一直记录笔者在使用GitHub中可能产生的错误及解决方法(会一直更新中),待一些Git初使用者参考,如果有说明不详细或不对的 ...
- css双飞翼布局
双飞翼布局是一种比较灵活的布局,始于淘宝UED,玉伯提出的,他着重介绍的是双飞翼栅格布局. 三列布局为"双飞燕"布局,可以把三栏比作一只鸟,main部分相当是于鸟的身体,而lef ...
- 解决OracleConnection ORA-1017 和 HRESULT:0x8007000B 错误
试图加载格式不正确的程序. (异常来自HRESULT:0x8007000B) 解决方案: IIS下 winform下: ORA-1017 错误