首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 4.0 基礎篇(十五):深入解析 TransactionScope 事務容器

     編輯:關於.NET

前言

在 WF 4.0 中,TransactionScope 是實現資料庫交易控制的核心活動。本文將透過完整範例,詳細說明如何使用 TransactionScope 管理交易、處理例外、設定隔離層級,以及自訂具備 Rollback 功能的活動。

環境準備

建立測試資料庫

首先建立名為 wxwinterWFTest 的資料庫,並在其中建立 UserTable 資料表:

CREATE TABLE UserTable (
    UserID NVARCHAR(50) PRIMARY KEY
);

資料表結構

自訂資料庫插入活動

建立 insertDataToSQLServerActivity,用於向資料表插入記錄:

public sealed class insertDataToSQLServerActivity : NativeActivity
{
    public InArgument<string> UserID { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        insertUserTable(UserID.Get(context));
    }

    void insertUserTable(string UserID)
    {
        using (var con = new System.Data.SqlClient.SqlConnection(
            "Data Source=.;Initial Catalog=wxwinterWFTest;Integrated Security=True;"))
        {
            con.Open();
            using (var cmd = con.CreateCommand())
            {
                cmd.CommandText = string.Format("insert into UserTable (UserID) values ('{0}')", UserID);
                cmd.ExecuteNonQuery();
            }
        }
    }
}

TransactionScope 核心屬性與功能

屬性類型說明
BodyActivity要在交易中執行的活動
TimeoutInArgument<TimeSpan>交易過期時間
AbortInstanceOnTransactionFailurebool交易失敗時是否中止工作流執行個體
IsolationLevelSystem.Transactions.IsolationLevel交易隔離層級

TransactionScope 結構

範例一:AbortInstanceOnTransactionFailure = false

工作流設計

  1. 加入 TransactionScope,設定 AbortInstanceOnTransactionFailure = false
  2. 在其中放入三個 insertDataToSQLServerActivity,分別插入 "wxd"、"wxwinter"、"wxd"(第三筆會因主鍵重複拋出例外)

工作流設計

宿主程式碼

static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
    Console.WriteLine("完成,狀態:{0}", e.CompletionState);
}

static void aborted(WorkflowApplicationAbortedEventArgs e)
{
    Console.WriteLine("aborted,Reason:{0}", e.Reason.Message);
}

static UnhandledExceptionAction unhandledException(WorkflowApplicationUnhandledExceptionEventArgs e)
{
    Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
    return UnhandledExceptionAction.Abort;
}

static void transactionScopeWorkflow()
{
    var instance = new WorkflowApplication(new TransactionScopeWorkflow());
    instance.Completed = workflowCompleted;
    instance.OnUnhandledException = unhandledException;
    instance.Aborted = aborted;
    instance.Run();
}

執行結果

因主鍵重複導致交易失敗,觸發 OnUnhandledException,工作流狀態為 Faulted。前兩筆資料已回滾,資料表保持空白。

結果1 結果2

範例二:AbortInstanceOnTransactionFailure = true

設定為 true 時,交易失敗會直接觸發 Aborted 事件,不會經過 OnUnhandledException。工作流狀態為 Canceled。

工作流設計 結果1 結果2

巢狀 TransactionScope 行為

  • 若內外層 AbortInstanceOnTransactionFailure 設定不一致,false 的層級會觸發 OnUnhandledException
  • 若皆為 true,內層逾時小於外層時,工作流會取消並觸發 Aborted

觸發交易的情境

  • 資料庫操作(如上述範例)
  • Code Activity 拋出例外
  • 呼叫 TerminateWorkflow 終止流程

自訂具備 Rollback 功能的活動

透過 RuntimeTransactionHandle 取得目前交易並手動呼叫 Rollback():

public sealed class rollbackTransactionActivity : NativeActivity
{
    public InArgument<string> Text { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        var handle = new RuntimeTransactionHandle();
        handle = context.Properties.Find(handle.ExecutionPropertyName) as RuntimeTransactionHandle;
        var transaction = handle.GetCurrentTransaction(context);
        
        Console.WriteLine("LocalIdentifier:{0}", transaction.TransactionInformation.LocalIdentifier);
        Console.WriteLine("CreationTime:{0}", transaction.TransactionInformation.CreationTime);
        Console.WriteLine("Status:{0}", transaction.TransactionInformation.Status);
        Console.WriteLine("IsolationLevel:{0}", transaction.IsolationLevel);
        
        transaction.TransactionCompleted += (s, e) => Console.WriteLine("TransactionCompleted");
        transaction.Rollback(new Exception("wxwinter 手動回滾事務"));
    }
}

工作流設計 執行結果

隔離層級說明

層級說明
ReadUncommitted允許髒讀,不發布共享鎖
ReadCommitted預設值,避免髒讀,但可能不可重複讀
RepeatableRead鎖定查詢範圍資料,防止不可重複讀
Serializable最高層級,範圍鎖定防止幻影讀
Snapshot透過版本控制減少阻塞

隔離層級

原始碼下載

TransactionScopeWorkflow.rar

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved