[WCF编程]12.事务:服务事务编程(下)
一、投票与提交
虽然WCF负责事务传播及两阶段提交协议的管理工作,但是 她不知道事务是否应该提交或终止。这需要根服务告诉WCF应该何时启动两阶段提交协议、是提交还是终止。WCF提供了两种编程模式来对事务的结果进行投票,即声明式和显式模式。
声明式投票
WCF可以代替服务自动完成提交或终止事务的投票。自动投票是通过OpreationBehavior的TransactionAutoComplete属性来控制的。
TransactionAutoComplete属性的默认值为true,可以如下使用:
//服务端代码必须置于服务中执行
[OperationBehavior(TransactionScopeRequired = true,TransactionAutoComplete=true)]
public void CSMethod()
{
//获取当前事务对象
Transaction transaction = Transaction.Current;
}当这个属性设置为true时,如果操作里没有未处理的异常,则WCF将会自动提交事务。如果存在异常,WCF将会投票终止事务。注意,即使WCF必须通过捕获异常来终止事务,它也是会重新抛出异常,以便异常沿着调用链传播。
为了依赖自动投票,必须把服务的TransactionScopeRequired 属性设置为true,因为自动投票只有在WCF为服务设置了事务环境时才有用。
在TransactionScopeRequired设置为true时,要尽量避免捕获和处理异常,显式避免终止事务。
//服务端代码必须置于服务中执行
[OperationBehavior(TransactionScopeRequired = true)]
public void CSMethod()
{
try
{
...
}
catch
{
Transactionn.Current.Rollback();
}
}虽然服务捕获了一次异常,但操作仍会引发异常,这是因为WCF会在客户端抛出现像AbortedException一样的异常。WCF是会这样做 的,因为服务也许是包含多个服务、机器和站点事务的一部分。
明确投票
当TransactionAutoComplete设置为false时,需要使用明确投票。
当禁止声明式投票时,默认情况下,无论是否发生异常,WCF将会自动终止所有的事务,你需要明确使用操作上下文的SetTransactionComplete()方法来提交事务。
public sealed class OperationContext : IExtensibleObject<OperationContext>
{
//......</span><span style="color: #008000">//</span><span style="color: #008000"> 摘要:
</span><span style="color: #008000">//</span><span style="color: #008000"> 提交当前正在执行的事务。
</span><span style="color: #008000">//</span>
<span style="color: #008000">//</span><span style="color: #008000"> 异常:
</span><span style="color: #008000">//</span><span style="color: #008000"> System.InvalidOperationException:
</span><span style="color: #008000">//</span><span style="color: #008000"> 上下文中没有任何事务。</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> SetTransactionComplete();
}
确保在调用SetTransactionComplete()之后没有再执行任何操作,特别是事务性工作。
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete=false)]
public void CSMethod()
{
try
{
OperationContext.Current.SetTransactionComplete();
}
catch (Exception)
{
throw;
}
}如果调用后尝试执行任何事务性工作,即使访问OperationContext.Current,WCF就会抛出相关的异常并终止事务。
明确投票是为投票需要依赖其它信息(包括异常和错误)的情况而设计的。但是,对于大部分应用程序与服务来说,应该选择简单的声明式投票方式。
终止事务
事务何时结束是由事务发起者决定的。根服务可以调用其它服务并把事务传播给它们。注意,下游服务只能使用对事务投票,不能提交完成事务。只有根事务可以同时投票和提交完成事务。
当非事务型客户端发起事务时,事务会在客户销毁事务对象时结束。
二、事务超时
当事务试图访问其它事务占有的资源管理器且需要占用很久时可能会发生死锁。为了解决这个问题,事务必须能够在一定的超时事件(默认60s)内自动终止事务。一旦终止事务,任何传播事务到服务的操作都会导致异常。
超时的服务行为属性,而且服务上的所有终结点的所有操作使用相同的超时事件。可以通过ServiceBehaviorAttribute的TransactionTimeout属性来设置超时时间。
例如,下面设计30s超时的代码:
[ServiceBehavior(TransactionTimeout="00:00:30")]
public class ClientServiceTransaction : IClientServiceTransaction
{......}也可以在宿主配置文件里通过定义服务的自定义行为来配置事务超时事件。
......
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceTimeouts transactionTimeout="00:00:30"/>
</behavior>
</serviceBehaviors>
</behaviors>
......以上事务超时的最大值为10min。可以通过机器配置文件来指定超过10分钟的最大值,如40分钟,以下是对machine.config的配置:
......
<system.transactions>
<mechineSettings maxTimeout = "00:40:00"/>
</system.transactions>
......
[WCF编程]12.事务:服务事务编程(下)的更多相关文章
- [WCF编程]12.事务:服务事务编程(上)
一.设置环境事务 默认情况下,服务类和操作没有环境事务,即使客户端事务传播到服务端也是如此. 尽管强制事务流从客户端传播过来,但服务端的环境事务依旧为null.为了启用环境事务,每个操作必须告诉WCF ...
- [WCF编程]12.事务:事务协议与管理器
一.事务协议 总体来说,WCF开发人员不需要涉及事务协议与管理器.我们应该依赖WCF来选择相应的事务协议和管理器,重点关注业务逻辑的实现. WCF是根据事务范围里的参与个体来选择事务管理协议的.事务管 ...
- [WCF编程]12.事务:事务概述
一.事务概述 维护系统一致性和正确地处理错误恢复挑战的最佳方式是使用事务. 一个事务就是一个复杂操作的集合,这个集合中任何一个操作的失败都会引起整个集合的失败. 尽管在事务进行时系统被允许暂时出于不一 ...
- 使用WCF实现SOA面向服务编程—— 架构设计
原文地址:http://www.cnblogs.com/leslies2/archive/2011/03/29/1997889.html SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就 ...
- JAVA / MySql 编程——第五章 事务、视图、索引、备份和恢复
1.事务(Transaction): 事务是将一系列数据操作绑成一个整体进行统一管理. 如果一事务执行成功,则咋子该事务中进行的所有数据更改均会提交,称为数据库中的永久成部分. 如果事务执行是遇到错误 ...
- VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载
VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载 #include <stdio.h>#include &l ...
- 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册
<Linux多线程服务端编程:使用muduo C++网络库>这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错 ...
- 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- http服务&ajax编程
http服务&ajax编程 1.服务器 前言:通俗的讲,能够提供某种服务的机器(计算机)称为服务器 1.1.服务器类型 按照不同的划分标准,服务可划分为以下类型: 按服务类型可分为:文件服务器 ...
随机推荐
- iconfont的蜕化操作
很多国外的网站,访问的时候可以看到,页面先是大面积白一下,然后恢复正常.原因是网页上用到了 webfont,这些页面很多情况都是直接引用 google 的 webfont 地址,中华大局域网下,由于网 ...
- 《HiWind企业快速开发框架实战》(1)框架的工作原理
<HiWind企业快速开发框架实战>(1)框架的工作原理 1.HiWind架构 HiWind的基本架构如下: 持久层部分:同时为框架本身的业务服务,也为开发人员的自定义业务服务. 逻辑层: ...
- SQL Server null知多少?
null是什么? 不知道.我是说,他的意思就是不知道(unknown). 它和true.false组成谓词的三个逻辑值,代表“未知”.与true和false相比,null最难以令人捉摸,因为它没有明确 ...
- 现代程序设计 网页前端开发作业(to 邹欣老师)
在一些著名的网站的搜索框上,会有一种“自动完成”功能. 比如google.百度和淘宝: 现在,我们来考虑如何实现这个功能. 第一步:模仿任意一个网站,编写一个类似的网页效果原型. 在这一步,不要估计开 ...
- C语言 · 求矩阵各个元素的和
问题描述 这里写问题描述. 输入格式 测试数据的输入一定会满足的格式. 例:输入的第一行包含两个整数n, m,分别表示矩阵的行数和列数.接下来n行,每行m个正整数,表示输入的矩阵. 输出格式 要求用户 ...
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- JQuery图片切换动画效果
由于博主我懒,所以页面画的比较粗糙,但是没关系,因为我主要讲的是如何实现图片动画切换. 思路:想必大家都逛过淘宝或者其他的一些网站,一般都会有图片动画切换的效果,那是怎样实现的呢?博主我呢,技术不是很 ...
- Echarts3 关系图-力导向布局图
因为项目需要,要求实现类似力导图效果的图,我就瞄上了echarts. 注意事项1:由于我的项目要部署到内网,所以js文件要在本地,网上大多力导图都是echarts2的,而其又依赖zrender基础库, ...
- C#6.0 十大常用特性
一.字符串插值 (String Interpolation) C# 6之前我们拼接字符串时需要这样 var Name = "Jack"; var results = "H ...
- HttpClient异步调用WEB服务
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...