[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默认情况下会对运行期例 ...
随机推荐
- 理解C# 4 dynamic(3) – DynamicObject的使用
上篇文章"理解C# 4 dynamic(2) – ExpandoObject的使用" 了解了ExpandoObject的基本使用. 但ExpandoObject的问题就是它是一个万 ...
- 跨域获取json一些理解[腾讯电商数据的拉取方式]
如何跨域获取json数据源?我们都知道要有callback,具体callback是如何工作的呢?如果服务器端不接收callback,我们是不是就没有办法处理了呢?读完本文后相信你会有一个大体的了解. ...
- 非正规方法处理AngulurJS模块管理问题
1.起因 自己一直做winform,有幸从某个大神手里接了一个node.js,express,angulurJS等集众多开源框架的一个项目,赶鸭子上架,于是一边学习,一边用自己以往的思中去整理,重构代 ...
- 浅谈微信小程序对于创业者,意味着什么?
尽管这个话题,有点儿烂大街,然而作为开发者兼创业人,兹以为很有必要为自己梳理一番. 多年前,当萌生创业的念头时,我是这样在脑海里绘制这幅蓝图的: 我需要一个域名,一个服务器,并且备了案. 我需要至少一 ...
- 使用JavaMail创建邮件发送邮件
一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...
- PHP制作查询租房表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SQL 2014 AlwaysOn 搭建
AlwaysOn底层依然采用Windows 故障转移群集的机制进行监测和转移,因此也需要先建立Windows Cluster,只不过可用性组中的数据库不一定非要再存放在共享存储上了.可以是存储在本地磁 ...
- SpringMVC常用的注解
1. @Controller @Controller用于标识控制层主键,负责注册一个bean到spring上下文,bean的ID默认为首字母小写的类名称,用户也可以自定义. 例如: 方式一: @Co ...
- VS创建MVC出错解决方法
搞定
- 完全抽离WebAPi之特殊需求返回HTML、Css、JS、Image
前言 今天我们来实现一个特殊的需求,这个需求说来也不过分,不过有点违背WebAPi的真实用途,WebAPi不过是作为传输数据而用,若非在项目开发中断不可想到还要实现一个页面来实时显示列表并进行后续其他 ...