[WCF編程]12.事務:Transaction類

1、概述

    .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()方法手動終止事務。其它的功能包括添加資源管理器、設置隔離級別、訂閱事務事件,爲併發線程克隆事務,以及獲取事務狀態和其它信息。併發

2、環境事務

    .NET 2.0定義了一個環境事務的概念,那就是代碼執行的事務。要獲取事務環境的引用,能夠經過調用Transaction的Current屬性。分佈式

Transaction ambientTransaction = Transaction.Current;

    若是沒有環境事務,Curent就會返回null。不管是服務端,仍是客戶端的每段代碼均可以獲取環境事務。環境事務對象存儲在線程本地存儲裏(TLS)。所以,當線程在相同的調用鏈上跨越多個對象和方法時,全部的對象和方法均可以訪問它的環境事務。ui

    客戶端不能將已經終止的事務傳遞給服務端,強制傳遞會引起異常。spa

3、本地事務VS分佈式事務

    Transaction類能夠用來處理本地和分佈式事務。每一個事務對象都有兩個標識,一個是本地事務標識,另外一個是分佈式事務標識。能夠經過訪問Transaction類的TransactionInformation屬性得到標識:線程

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

    TransactionInformation屬性爲TransactionInformation類型,定義以下:日誌

public class TransactionInformation
{      
    //......      
    public Guid DistributedIdentifier { get; }
      
    public string LocalIdentifier { get; }
      
}

    事務標識主要用做日誌、跟蹤和分析。code

本地事務標識

    本地事務標識(本地ID)包含了當前應用程序域裏LTM的標識,也包含了一個枚舉事務的序數。咱們能夠經過TransactionInformation的LocalIdentifier 屬性訪問到本地ID。事務本地ID在環境事務中能夠一直使用,並且從不爲null:只要有環境事務,他就會返回有效的本地ID。orm

    本地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。

相關文章
相關標籤/搜索