本节主要介绍WF4的事物
本文例子下载:
https://files.cnblogs.com/foundation/TransactionScopeWorkflow.rar
本文例子说明
准备
例子中要用到的数据库
创建一个名为[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(); } |
结果 |