一、概述

.NET2.0在命名空间System.Transactions下提供了Transaction类,它表示所有.NET事务管理器使用的事务。

[Serializable]
public class Transaction : IDisposable, ISerializable
{
//......
public static Transaction Current { get; set; }
public void Dispose();
public void Rollback();
public void Rollback(Exception e); }

Transaction类主要用来通过调用Rollback()方法手动终止事务。其它的功能包括添加资源管理器、设置隔离级别、订阅事务事件,为并发线程克隆事务,以及获取事务状态和其它信息。

二、环境事务

.NET 2.0定义了一个环境事务的概念,那就是代码执行的事务。要获取事务环境的引用,可以通过调用Transaction的Current属性。

Transaction ambientTransaction = Transaction.Current;

如果没有环境事务,Curent就会返回null。无论是服务端,还是客户端的每段代码都可以获取环境事务。环境事务对象存储在线程本地存储里(TLS)。因此,当线程在相同的调用链上跨越多个对象和方法时,所有的对象和方法都可以访问它的环境事务。

客户端不能将已经终止的事务传递给服务端,强制传递会引发异常。

三、本地事务VS分布式事务

Transaction类可以用来处理本地和分布式事务。每个事务对象都有两个标识,一个是本地事务标识,另一个是分布式事务标识。可以通过访问Transaction类的TransactionInformation属性获得标识:

[Serializable]
public class Transaction : IDisposable, ISerializable
{
//......
public TransactionInformation TransactionInformation { get; }
}

TransactionInformation属性为TransactionInformation类型,定义如下:

public class TransactionInformation
{
//......
public Guid DistributedIdentifier { get; }
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> LocalIdentifier { <span style="color: #0000ff">get</span><span style="color: #000000">; }

}

事务标识主要用作日志、跟踪和分析。

本地事务标识

本地事务标识(本地ID)包含了当前应用程序域里LTM的标识,也包含了一个枚举事务的序数。我们可以通过TransactionInformation的LocalIdentifier 属性访问到本地ID。事务本地ID在环境事务中可以一直使用,而且从不为null:只要有环境事务,他就会返回有效的本地ID。

本地ID包含两个部分:唯一标识应用程序域和当前应用程序域的LTM的GUID,另一个整数代表当前LTM管理的事务数。例如,如果服务跟踪了单个连续的事务,开始第一个调用,它会得到如下结果:

8957asc6-1das-42dd-5fe8-60df953f252f6:1

8957asc6-1das-42dd-5fe8-60df953f252f6:2

8957asc6-1das-42dd-5fe8-60df953f252f6:3

如果服务托管和客户端在同一个应用程序域里,它们就具有相同的GUID。如果客户端跨域调用,则客户端会获得一个标识自己局部LTM的GUID。

分布式事务标识

分布式事务标识(分布式ID)会在LTM或KTM提升为DTC事务时自动生成,如当环境事务流传播给其它服务时,可以通过TransactionInformation的DistributedIdentifier属性获得分布式事务ID。

分布式事务ID对于每个事务来说都是唯一的,不会有两个事务同时拥有相同的分布式ID。更重要的时,分布式ID在跨域服务边界和整个调用链时,其格式是不同的。因此,对于日志和跟踪十分有用。

注意,对于没有提升的事务来说,分布式ID的值为Guid.Empty。在客户端做哦为根事务,但是还没有发起调用时,这个值就是Guid.Empty;如果服务端没有使用客户端事务,这个值也是Guid.Empty。

[WCF编程]12.事务:Transaction类的更多相关文章

  1. [WCF编程]12.事务:事务协议与管理器

    一.事务协议 总体来说,WCF开发人员不需要涉及事务协议与管理器.我们应该依赖WCF来选择相应的事务协议和管理器,重点关注业务逻辑的实现. WCF是根据事务范围里的参与个体来选择事务管理协议的.事务管 ...

  2. [WCF编程]12.事务:事务概述

    一.事务概述 维护系统一致性和正确地处理错误恢复挑战的最佳方式是使用事务. 一个事务就是一个复杂操作的集合,这个集合中任何一个操作的失败都会引起整个集合的失败. 尽管在事务进行时系统被允许暂时出于不一 ...

  3. [WCF编程]12.事务:服务事务编程(下)

    一.投票与提交 虽然WCF负责事务传播及两阶段提交协议的管理工作,但是 她不知道事务是否应该提交或终止.这需要根服务告诉WCF应该何时启动两阶段提交协议.是提交还是终止.WCF提供了两种编程模式来对事 ...

  4. [WCF编程]12.事务:服务事务编程(上)

    一.设置环境事务 默认情况下,服务类和操作没有环境事务,即使客户端事务传播到服务端也是如此. 尽管强制事务流从客户端传播过来,但服务端的环境事务依旧为null.为了启用环境事务,每个操作必须告诉WCF ...

  5. [WCF编程]12.事务:事务传播

    一.事务传播概述 WCF可以跨越服务边界传递事务.这可以让服务参与到客户端事务里,客户端还可以在同一个事务里调用多个服务.客户端本身不一定是WCF服务.客户端事务是否传播到服务端可以通过绑定和操作契约 ...

  6. 基于 Transaction 类的分布式显式事务

    自.NET2.0以来增加了System.Transactions命名空间,为.NET应用程序带来了一个新的事务编程模型. 这个命名空间提供了几个依赖的TransactionXXX类.Transacti ...

  7. [WCF编程]3.WCF基础

    一.服务 服务是一组公开功能的集合. 服务内部包含了如语言.技术.版本与框架等概念,服务之间的交互只允许使用规定的通信模式 外界客户端并不知道服务内部的实现细节,所以WCF服务通常通过元数据的方式描述 ...

  8. 【WCF--初入江湖】01 WCF编程概述

    01 WCF编程概述 SOA的优点 1.服务独立于平台和工作环境.服务并不关心自己所处的环境,也不关心与之进行通信的服务所处的    环境. 2.服务相互隔离. 3.服务对协议.格式和传输中立. 4. ...

  9. Spring事务Transaction配置的五种注入方式详解

    Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...

随机推荐

  1. gulp es7配置文件

    http://sanwen.net/a/ybsfcoo.html /** * Created by udi on 2016/11/24. */ var gulp = require('gulp'); ...

  2. 你所不知道的JavaScript数组

    相信每一个 javascript 学习者,都会去了解 JS 的各种基本数据类型,数组就是数据的组合,这是一个很基本也十分简单的概念,他的内容没多少,学好它也不是件难事情.但是本文着重要介绍的并不是我们 ...

  3. 手工给Meteor增加smart package的方法

    windows下无法装mrt(Meteor的包管理工具).不过还好smart package本身也就只是一个文件夹而已,不需要在Meteor中注册什么东西.所以直接把smart package扔到me ...

  4. [nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI

    前一篇分析了前十个基础实验的代码,从这里开始分析后十个~ 一.PPI原理: PPI(Programmable Peripheral Interconnect),中文翻译为可编程外设互连. 在nRF51 ...

  5. Unicode编码解码在线转换工具

    // Unicode编码解码在线转换工具 Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式(The Unicode Standar ...

  6. C语言 · 查找整数

    问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个. 输入格式 第一行包含一个整数n. 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000. 第三行包含一个 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  8. The transaction log for database 'xxxx' is full due to 'ACTIVE_TRANSACTION'

    今天查看Job的History,发现Job 运行失败,错误信息是:“The transaction log for database 'xxxx' is full due to 'ACTIVE_TRA ...

  9. Task C# 多线程和异步模型 TPL模型

    Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task TaskCompletionSource 更通用, ...

  10. MVC4做网站后台:栏目管理3、删除栏目与左侧列表菜单

    一.左侧列表菜单 打开视图Menu.cshtml,增加部分见红框 在category中添加脚本 //栏目菜单加载完毕函数 function CategoryMenu_Ready() { $('#cat ...