程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WF 4.0基礎篇(十五) TransactionScope事物容器

WF 4.0基礎篇(十五) TransactionScope事物容器

編輯:關於.NET

本文例子說明

准備 例子中要用到的數據庫

創建一個名為[wxwinterWFTest]的數據庫,

在數據庫中創建一個名為[UserTable]的表,在表中創建一個名[UserUD]的[nurchar(50)]的字段,設成主鍵

例子中要用到的操作數據庫的Activity

[insertDataToSQLServerActivity]有一個[In 參數] UserID,用於向[UserTable]表插入記錄

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)
{
System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection();
con.ConnectionString = "Data Source=.;Initial Catalog=wxwinterWFTest;Integrated Security=True;";
con.Open();
System.Data.SqlClient.SqlCommand cmd = con.CreateCommand();
cmd.CommandText = string.Format("insert into UserTable (UserID) values ('{0}')", UserID);
cmd.ExecuteNonQuery();
con.Close();
}
}

TransactionScope 事物容器

類名 System.Activities.Statements.TransactionScope 文件 System.Activities.dll 結構說明 繼承 NativeActivity

是一個 sealed類

override 了 [CacheMetadata方法] 與 [Execute方法]

override 了 [CanInduceIdle屬性]

[AbortInstanceOnTransactionFailure]屬性的類型為[bool]

[Body]屬性的類型為[Activity]

[IsolationLevel]屬性的類型為[System.Transactions.IsolationLevel]

[Timeout]屬性的類型為[InArgument<TimeSpan>]

[ShouldSerializeIsolationLevel方法]返回值為[bool],無參數

[ShouldSerializeTimeout方法]返回值為[bool],無參數

功能說明 Body:要在事務中執行的Activity

TimeOut:事務的過期時間

AbortInstanceOnTransactionFailure:事務取消時是否取消工作流的執行

IsolationLevel :事務的隔離級別

例:基本使用[AbortInstanceOnTransactionFailure為false

如果[TransactionScope.AbortInstanceOnTransactionFailure]為False,會觸發實例的OnUnhandledException

多個[TransactionScope]嵌套的時候,如果[TransactionScope.AbortInstanceOnTransactionFailure]不一致,為False的會觸發實例 的OnUnhandledException

1.在工作流中添加一個[TransactionScope]

2.將[AbortInstanceOnTransactionFailure]設為false

3.在[TransactionScope]中分別添加三個[insertDataToSQLServerActivity],用於插入"wxd","wxwinter","wxd"三條記錄

流程

宿主

//=================================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}",e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledException(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Abort;
}
//=================================================================
static void transactionScopeWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new TransactionScopeWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledException;
instance.Aborted = aborted;
instance.Run();
}

結果

當不使用[TransactionScope]時,在工作流中分別添加三個[insertDataToSQLServerActivity],用於插入"wxd","wxwinter","wxd"三條 記錄時的執行結果說明

流程 宿主 同上 結果

例:基本使用AbortInstanceOnTransactionFailure為true

[TransactionScope.AbortInstanceOnTransactionFailure]為true時,不為會觸發實例的OnUnhandledException,會直接Aborted,會觸發 實例的Aborted

多個 [TransactionScope]嵌套的時候,如果內部[TransactionScope]過期時間小於外部[TransactionScope] 過期時間,當這些 [TransactionScope.AbortInstanceOnTransactionFailure]都為true時,工作流會取消,會觸發實例的Aborted,如果 [TransactionScope.AbortInstanceOnTransactionFailure]不一致,為False的會觸發實例的OnUnhandledException

1.在工作流中添加一個[TransactionScope]

2.將[AbortInstanceOnTransactionFailure]設為[true]

3.在[TransactionScope]中分別添加三個[insertDataToSQLServerActivity],用於插入"wxd","wxwinter","wxd"三條記錄

流程

宿主

//=================================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}",e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledException(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Abort;
}
//=================================================================
static void transactionScopeWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new TransactionScopeWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledException;
instance.Aborted = aborted;
instance.Run();
}

結果

可引發Transaction的情況 可發引發Transaction的情況 操作數據庫

見基本使用

Code Activity的代碼異常

一個用於產生異常的Code Activity

ExceptionActivity

public sealed class ExceptionActivity : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
int v = 1 - 1;
double i = 1 / v;
}
}

流程

宿主

//=================================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}",e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledException(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Abort;
}
//=================================================================
static void transactionTypeWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new TransactionTypeWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledException;
instance.Aborted = aborted;
instance.Run();
}

結果

TerminateWorkflow 結束流程

流程

宿主

//=================================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}",e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledException(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Abort;
}
//=================================================================
static void transactionTypeWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new TransactionTypeWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledException;
instance.Aborted = aborted;
instance.Run();
}

結果

IsolationLevel 事務的隔離級別

在事務完成之前,其他用戶無法查詢,更新,修改事務隔離的數據

對數據所在表的全表讀取(Select * from Table)被鎖定

可以插入數據新數據.

可以更新沒被事務隔離的數據

可以刪除沒被事務隔離的數據

Unspecified 正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。 Chaos 無法覆蓋隔離級別更高的事務中的掛起的更改。 ReadUncommitted 可以進行髒讀,意思是說,不發布共享鎖,也不接受獨占鎖。 ReadCommitted 在正在讀取數據時保持共享鎖,以避免髒讀,但是在事務結束之前可以更改數據,從而導致不可重復的讀取或幻像數據。 RepeatableRead 在查詢中使用的所有數據上放置鎖,以防止其他用戶更新這些數據。防止不可重復的讀取,但是仍可以有幻像行。 Serializable 在 DataSet 上放置范圍鎖,以防止在事務完成之前由其他用戶更新行或向數據集中插入行。 Snapshot 通過在一個應用程序正在修改數據時存儲另一個應用程序可以讀取的相同數據版本來減少阻止。表示您無法從一個事務中看到 在其他事務中進行的更改,即便重新查詢也是如此。

自定義具有Rollback功能的Activity

具有Rollback功能的Activity

rollbackTransactionActivity

public sealed class rollbackTransactionActivity : NativeActivity
{
public InArgument<string> Text { get; set; }
protected override void Execute(NativeActivityContext context)
{
// Reference System.Transactions.Dll 
RuntimeTransactionHandle runtimeTransactionHandle = new RuntimeTransactionHandle();
runtimeTransactionHandle = context.Properties.Find(runtimeTransactionHandle.ExecutionPropertyName) as RuntimeTransactionHandle;
var transaction = runtimeTransactionHandle.GetCurrentTransaction(context);
var info = transaction.TransactionInformation;
System.Console.WriteLine("LocalIdentifier:{0} ", info.LocalIdentifier);
System.Console.WriteLine("CreationTime:{0} ", info.CreationTime);
System.Console.WriteLine("Status:{0} ", info.Status.ToString());
System.Console.WriteLine("DistributedIdentifier:{0} ", info.DistributedIdentifier);
System.Console.WriteLine("IsolationLevel:{0} ", transaction.IsolationLevel.ToString());
transaction.TransactionCompleted += new System.Transactions.TransactionCompletedEventHandler (transaction_TransactionCompleted);
//回滾當前事務 
transaction.Rollback(new System.Exception("wxwinter回滾事務說明"));
}
void transaction_TransactionCompleted(object sender, System.Transactions.TransactionEventArgs e)
{
System.Console.WriteLine("TransactionCompleted");
}
}

工作流

宿主

//=================================================================
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("完成,狀態:{0}",e.CompletionState.ToString());
}
static void aborted(WorkflowApplicationAbortedEventArgs e)
{
System.Console.WriteLine("aborted,Reason:{0}", e.Reason.Message);
}
static UnhandledExceptionAction unhandledException(WorkflowApplicationUnhandledExceptionEventArgs e)
{
System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);
return UnhandledExceptionAction.Abort;
}
//=================================================================
static void rollbackTransactionWorkflow()
{
WorkflowApplication instance = new WorkflowApplication(new rollbackTransactionWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
instance.OnUnhandledException = unhandledException;
instance.Aborted = aborted;
instance.Run();
}

結果

源碼: http://files.cnblogs.com/foundation/TransactionScopeWorkflow.rar

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved