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

本节主要介绍WF4的事物

 

本文例子下载:

http://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();

        }

结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值