.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)。所以,當線程在相同的調用鏈上跨越多個對象和方法時,全部的對象和方法均可以訪問它的環境事務。ui
客戶端不能將已經終止的事務傳遞給服務端,強制傳遞會引起異常。spa
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。