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


    本节主要介绍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();

    }

    结果

     

  • 相关阅读:
    HTML5 jQuery图片上传前预览
    【Web前沿技术】纯 CSS3 打造的10个精美加载进度条动画
    20个非常绚丽的 CSS3 特性应用演示
    C#.NET开源项目、机器学习、商务智能
    SqlServer中decimal(numeric )、float 和 real 数据类型的区别[转]
    asp.net Session
    Entity Framework 5.0系列之自动生成Code First代码
    关于Memcache mutex设计模式的.net实现
    Discuz!NT中的Redis架构设计
    使用ServiceStackRedis链接Redis简介
  • 原文地址:https://www.cnblogs.com/foundation/p/1633365.html
Copyright © 2020-2023  润新知