C# TransactionScope学习

C# TransactionScope学习持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情 前言: 今天这篇文章,我们一起学习一下自定义控件的使用和一些小技巧,这篇文章比较简单,适合小白,会的大

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

前言:

今天这篇文章,我们一起学习一下TransactionScope的使用,TransactionScope是使代码块成为事务性代码,TransactionScope类不能被继承。今天我们就一起来学习一下TransactionScope类,这篇文章比较简单,只是一点皮毛,创作不易,点赞关注评论收藏,你的点赞是我创作的动力,也是我学习的方向!!!

你学习了吗.webp

TransactionScope概念

在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的。这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入。在.net 2.0后,TransactionScope类的出现,大大的简化了事务的设计。

TransactionScope构造函数

TransactionScope()
初始化 TransactionScope 类的新实例。
TransactionScope(Transaction)
初始化 TransactionScope 类的新实例,并将指定的事务设置为环境事务,以便该范围中进行的事务性工作使用此事务。
TransactionScope(Transaction, TimeSpan)
使用指定的超时时间值初始化 TransactionScope 类的新实例,并将指定的事务设置为环境事务,以便该范围中进行的事务性工作使用此事务。
TransactionScope(Transaction, TimeSpan, EnterpriseServicesInteropOption)
使用指定的超时时间值和 COM+ 互操作性要求初始化 TransactionScope 类的新实例,并将指定的事务设置为环境事务,以便该范围中进行的事务性工作使用此事务。
TransactionScope(Transaction, TimeSpan, TransactionScopeAsyncFlowOption)
[在 .NET Framework 4.5.1 和更高版本中受支持] 使用指定的超时时间值初始化 TransactionScope 类的新实例,并将指定的事务设置为环境事务,以便该范围中进行的事务性工作使用此事务。
TransactionScope(Transaction, TransactionScopeAsyncFlowOption)
[在 .NET Framework 4.5.1 和更高版本中受支持] 初始化 TransactionScope 类的新实例,并将指定的事务设置为环境事务,以便该范围中进行的事务性工作使用此事务。
TransactionScope(TransactionScopeAsyncFlowOption)
使用指定的异步流选项初始化 TransactionScope 类的新实例。
TransactionScope(TransactionScopeOption)
以指定的要求初始化 TransactionScope 类的新实例。
TransactionScope(TransactionScopeOption, TimeSpan)
以指定的超时时间值和要求初始化 TransactionScope 类的新实例。
TransactionScope(TransactionScopeOption, TimeSpan, TransactionScopeAsyncFlowOption)
以指定的超时值、要求和异步流选项初始化 TransactionScope 类的新实例。
TransactionScope(TransactionScopeOption, TransactionOptions)
以指定的要求初始化 TransactionScope 类的新实例。
TransactionScope(TransactionScopeOption, TransactionOptions, EnterpriseServicesInteropOption)使用指定的范围和 COM+ 互操作性要求以及事务选项初始化 TransactionScope 类的新实例。
TransactionScope(TransactionScopeOption,TransactionOptions,TransactionScopeAsyncFlowOption)
[在 .NET Framework 4.5.1 和更高版本中受支持] 以指定的要求和异步流选项初始化 TransactionScope 类的新实例。
TransactionScope(TransactionScopeOption, TransactionScopeAsyncFlowOption)
以指定的要求和异步流选项初始化 TransactionScope 类的新实例。

TransactionScope类的方法

Complete()
指示范围中的所有操作都已成功完成。
Dispose()
结束事务范围。
Equals(Object)
确定指定对象是否等于当前对象。
GetHashCode()
作为默认哈希函数。
GetType()
获取当前实例的 TypeMemberwiseClone()
创建当前 Object 的浅表副本。
ToString()
返回表示当前对象的字符串。

简单示例

static void Main(string[] args)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                userBLL u = new userBLL();
                TeacherBLL t = new TeacherBLL();
                u.ADD();
                t.ADD();
                ts.Complete();
            }
        }

只需要把需要事务包裹的逻辑块写在using (TransactionScope ts = new TransactionScope())中就可以了。从这种写法可以看出,TransactionScope实现了IDispose接口。除非显示调用ts.Complete()方法。否则,系统不会自动提交这个事务。如果在代码运行退出这个block后,还未调用Complete(),那么事务自动回滚了。在这个事务块中,u.ADD()方法和t.ADD()方法内部都没有用到任何事务类。TransactionScope是基于当前线程的,在当前线程中,调用Transaction.Current方法可以看到当前事务的信息。具体关于TransactionScope的使用方法,已经它的成员方法和属性,可以查看MSDN。TransactionScope类是可以嵌套使用,如果要嵌套使用,需要在嵌套事务块中指定TransactionScopeOption参数。默认的这个参数为Required。 比如下面代码:

static void Main(string[] args)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                userBLL u = new userBLL();
                TeacherBLL t = new TeacherBLL();
                u.ADD();
                using (TransactionScope ts2 = new TransactionScope(TransactionScopeOption.Required))
                {
                    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                    t.ADD();
                    ts2.Complete();
                }
               ts.Complete();
            }
        }

当嵌套类的TransactionScope的TransactionScopeOption为Required的时候,则可以看到如下结果,他们的事务的ID都是同一个。并且,只有当2个TransactionScope都complete的时候才能算真正成功。 如果把TransactionScopeOption设为RequiresNew,则嵌套的事务块和外层的事务块各自独立,互不影响。

static void Main(string[] args)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                userBLL u = new userBLL();
                TeacherBLL t = new TeacherBLL();
                u.ADD();
                using (TransactionScope ts2 = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                    t.ADD();
                    ts2.Complete();
                }
              ts.Complete();
            }
        }

TransactionScopeOption设为Suppress则为取消当前区块的事务,一般很少使用。 对于多个不同服务器之间的数据库操作,TransactionScope依赖DTC(Distributed Transaction Coordinator)服务完成事务一致性。但是对于单一服务器数据,TransactionScope的机制则比较复杂。主要用的的是线程静态特性。线程静态特性ThreadStaticAttribute让CLR知道,它标记的静态字段的存取是依赖当前线程,而独立于其他线程的。既然存储在线程静态字段中的数据只对存储该数据的同一线程中所运行的代码可见,那么,可使用此类字段将其他数据从一个方法传递到该第一个方法所调用的其他方法,而且完全不用担心其他线程会破坏它的工作。TransactionScope 会将当前的 Transaction 存储到线程静态字段中。当稍后实例化 SqlCommand 时(在此 TransactionScope 从线程局部存储中删除之前),该 SqlCommand 会检查线程静态字段以查找现有 Transaction,如果存在则列入该 Transaction 中。通过这种方式,TransactionScope 和 SqlCommand 能够协同工作,从而开发人员不必将 Transaction 显示传递给 SqlCommand 对象。实际上,TransactionScope 和 SqlCommand 所使用的机制非常复杂。

总结:

这篇文章比较简单,只是简单的学习一下,对它有更多的认识,在有需求的时候最起码有路子,虽然很简单,但是也是可以学到东西的,我们学习了新的知识,对我们的知识储备及技术又有新的一点点的进步,C#的技术就是先简单再难嘛,积少成多之后才会成长才会进步,我们要不断的学习不断的探索,才能有学习的动力,才会有学习的欲望,创作不易,点赞评论收藏关注,嘿嘿,不喜勿喷!!!!

haoping21111.gif

今天的文章C# TransactionScope学习分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59605.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注