zoukankan      html  css  js  c++  java
  • [WCF编程]12.事务:Transaction类

    一、概述

        .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。

  • 相关阅读:
    AngularJS中service,factory,provider的区别
    AngularJs数据绑定原理
    H5项目常见问题及注意事项
    本地存储-localStroage/sessionStorage存储
    微信小程序 获取OpenId
    Nginx 常用命令
    Redis 分布式锁 解决集群环境下多次定时任务执行
    Spring Boot 动态修改 Scheduled (系统启动默认执行,动态修改)
    SpringBoot 部署war包
    Docker + Tomcat 实现 Springboot 项目增量升级
  • 原文地址:https://www.cnblogs.com/zxj159/p/4030273.html
Copyright © 2011-2022 走看看