WCF技术剖析之三十一:WCF事务编程[上篇]
WCF事务编程其实很简单,可以用三句话进行概括:通过服务契约决定事物流转(Transaction Flow)的策略;通过绑定实施事务的流转;通过服务行为控制事务的相关行为。本篇文章着重介绍如果通过TransactionFlowAttribute特性定义事务流转策略。
契约时是一种双边协定,是双方就某个关注点达成的一种共识。对于分布式事务的实现来讲,首先需要解决的是事务流转的问题,即事务将客户端的事务流向服务端。要解决事务流转的问题,需要在事务的发送方和接收方就流转问题达成共识,即双方采用相匹配的事务发送和接收策略。毫无疑问,这样的开关需要定义在服务契约之上,同时事务是基于服务操作的,所以事务流转策略最终应用到操作契约上面。
WCF通过TransactionFlowAttribute特性将相应的事务流转策略关联到某个服务之上,具体来讲,我们在定义服务契约的时候,直接将TransactionFlowAttribute特性应用到相应的操作契约上即可。我们先来看看TransactionFlowAttribute的定义,从下面的代码我们可以看到,TransactionFlowAttribute并仅仅是一个简单的自定义特性,它更是一个操作行为。至于该操作行为对事务流转行为作了怎样的控制,会在后续的文章详细讲述。
1: [AttributeUsage(AttributeTargets.Method)]
2: public sealed class TransactionFlowAttribute : Attribute, IOperationBehavior
3: {
4: //其他成员
5: public TransactionFlowAttribute(TransactionFlowOption transactions);
6: public TransactionFlowOption Transactions { get; }
7: }
当我们将TransactionFlowAttribute特性应用到操作契约的时候,具体事务流转策略通过TransactionFlowOption枚举指定,TransactionFlowOption定义如下。
1: public enum TransactionFlowOption
2: {
3: NotAllowed,
4: Allowed,
5: Mandatory
6: }
TransactionFlowOption一共定义了三选项:NotAllowed、Allowed和Mandatory,它们的分别代表的事务流转策略如下:
- NotAllowed:客户端的事务不允许被流转到服务端;服务端也不会试图去接收流入的事务,这是默认选项;
- Allowed:如果客户端事务存在,则被流转到服务端;服务端会试图去接收流入的事务;
- Mandatory:客户端必须在一个事务中进行服务调用,相应的事务并会被流转到服务端;服务端接收到的消息中必须包含被序列化的事务。
在下面定义的IBankingService服务契约中,我们将TransactionFlowAttribute特性应用到了用于进行转帐操作的Transfer方法之上,并指定事务流转选项为Mandatory。
1: [ServiceContract(Namespace = "http://www.artech.com/")]
2: public interface IBankingService
3: {
4: [OperationContract]
5: [TransactionFlow(TransactionFlowOption.Mandatory)]
6: void Transfer(string accountFrom, string accountTo, double amount);
7: }
对于Mandatory选项,如果客户端在进行服务调用的时候并不存在事务,或者说服务端并没有接收到任何流入的事务(当客户端和服务端采用的契约定义了不匹配的事务流转策略时会出现这种情况下,比如客户端采用NotAllowed选项,客户端则采用Mandatory,那么服务端永远也接收不到流入的事务),都会抛出如图1所示的ProtocolException异常。
图1 在选用Mandatory选项下客户端不存在事务导致的异常
事务从客户端流转到服务端后,服务端可以中止事务,并将结果返回到客户端。从这个意义上讲,事务流转建立在请求/回复消息交换模式(MEP)之上,所以,在一个单向(One-Way)操作契约上,不允许应用TransactionFlowAttribute并指定Allowed或者Mandatory选项。比如下面的服务契约定义是不合法的:
1: [ServiceContract(Namespace = "http://www.artech.com/")]
2: public interface IBankingService
3: {
4: [OperationContract(IsOneWay = true)]
5: [TransactionFlow(TransactionFlowOption.Mandatory)]
6: void Transfer(string accountFrom, string accountTo, double amount);
7: }
如果某个服务实现了这样的服务契约,在进行服务寄宿的时候,会抛出如图2所示的InvalidOperationException异常(如果仔细的话还会看到VS一个汉化的问题:“单项”应该是“单向”,呵呵!!)。
图2 在单向操作上应用TransactionFlowAttribute特性导致的异常
- SpringBoot开发案例之整合mail队列进阶篇
- SpringBoot开发案例之集成SSL证书
- SpringBoot开发案例之整合mail队列篇
- SpringBoot开发案例之整合日志管理
- SpringBoot开发案例之奇技淫巧
- SpringBoot开发案例之整合Spring-data-jpa
- SpringBoot开发案例之整合定时任务(Scheduled)
- SpringBoot开发案例之整合mail发送服务
- SpringBoot开发案例之整合mongoDB
- Docker学习之CentOS 7安装配置
- Docker学习之搭建JavaWeb环境
- Docker学习之搭建JavaWeb环境进阶篇
- Docker学习之网络模式配置
- Docker学习之SSH连接docker容器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android开发实现去除bitmap无用白色边框的方法示例
- Android开发实现的内存管理工具类
- Android日期和时间选择器实现代码
- Android开发实现ImageView加载摄像头拍摄的大图功能
- Android开发实现的Intent跳转工具类实例
- Android开发中的文件操作工具类FileUtil完整实例
- Android开发中超好用的正则表达式工具类RegexUtil完整实例
- Android ijkplayer的使用方法解析
- Android开发实现查询远程服务器的工具类QueryUtils完整实例
- 解决android studio 3.0 加载项目过慢问题–maven仓库选择
- Android实现朋友圈点赞列表
- Kotlin基本类型自动装箱一点问题剖析
- Kotlin入门教程之开发环境搭建
- Android:Field can be converted to a local varible.的解决办法
- Android使用多线程进行网络聊天室通信