WF4.0 基础篇 (十五) TransactionScope 事物容器

本节主要介绍WF4的事物

 

本文例子下载:

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

本文例子说明

image.png

 

image.png


准备


例子中要用到的数据库

创建一个名为[wxwinterWFTest]的数据库,

在数据库中创建一个名为[UserTable]的表,在表中创建一个名[UserUD]的[nurchar(50)]的字段,设成主键

image.png

例子中要用到的操作数据库的Activity

[insertDataToSQLServerActivity]有一个[In 参数] UserID,用于向[UserTable]表插入记录

public sealed class insertDataToSQLServerActivity : NativeActivity

{

public InArgument<string> UserID { getset; }

 

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 :事务的隔离级别

 

 

 

 

 

image.png

例:基本使用[AbortInstanceOnTransactionFailure为false

如果[TransactionScope.AbortInstanceOnTransactionFailure]为False,会触发实例的OnUnhandledException

多个[TransactionScope]嵌套的时候,如果[TransactionScope.AbortInstanceOnTransactionFailure]不一致,为False的会触发实例的OnUnhandledException

 

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

2.将[AbortInstanceOnTransactionFailure]设为false

3.在[TransactionScope]中分别添加三个[insertDataToSQLServerActivity],用于插入"wxd","wxwinter","wxd"三条记录

 

流程

image.png

宿主

//=================================================================

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();

}

结果

 image.png

 

 

当不使用[TransactionScope]时,在工作流中分别添加三个[insertDataToSQLServerActivity],用于插入"wxd","wxwinter","wxd"三条记录时的执行结果说明

 

流程

image.png

宿主

同上

结果


image.png

 

例:基本使用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"三条记录

流程

image.png

宿主

//=================================================================

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();

}

结果

 

image.png

 

 


可引发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;

}

}

流程

image.png

宿主

//=================================================================

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();

}

结果

image.png

 


TerminateWorkflow 结束流程


流程

image.png

宿主

//=================================================================

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();

}

结果

image.png

 


IsolationLevel 事务的隔离级别


image.png

在事务完成之前,其他用户无法查询,更新,修改事务隔离的数据

对数据所在表的全表读取(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 { getset; }

 

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");

}

}

工作流

image.png

宿主

//=================================================================

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();

}

结果

image.png

 


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864