一、概述

.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. 浅谈Android应用保护(零):出发点和背景

    近几年来,无线平台特别是Android平台的安全逐渐成为各厂商关注的重点.各种新的思路和玩法层出不穷.所以,笔者基于前一段时间的学习和整理,写了这系列关于Android应用安全和保护的文章. 这5篇文 ...

  2. 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

    一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...

  3. Sublime Text3 配置 NodeJs 环境

    前言 大家都知道,Sublime Text 安装插件一般从 Package Control 中直接安装即可,当我安装 node js 插件时候,直接通过Package Control 安装,虽然插件安 ...

  4. SQL Server DDL触发器运用

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) DDL运用场景(DDL Scene) ...

  5. WPF做验证码,小部分修改原作者内容

    原文地址:http://www.cnblogs.com/tianguook/p/4142346.html 首先感谢aparche大牛的帖子,因为过两天可能要做个登录的页面,因此,需要用到验证码,从而看 ...

  6. Python 模块学习:os模块

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...

  7. ASP.NET MVC5 网站开发实践(二) Member区域–我的咨询列表及添加咨询

    上次把咨询的架构搭好了,现在分两次来完成咨询:1.用户部分,2管理部分.这次实现用户部分,包含两个功能,查看我的咨询和进行咨询. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NE ...

  8. lintcode 落单的数(位操作)

    题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...

  9. ABZ理论

    前言 身为著名的创业者+投资人,LinkedIn和Paypal的联合创始人Reid Hoffman有一个令我印象深刻的ABZ理论,他认为,你在任何时刻,手中都需要有三个计划:A计划.B计划和Z计划. ...

  10. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...