C#中回滚TransactionScope的使用方法和原理
TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成
实事上,一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完成,它一般放在try{}的结尾处,不用判断前台操作是否成功,如果不成功,它会自己回滚。
在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的。这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入。
在.net 2.0后,TransactionScope类的出现,大大的简化了事务的设计。示例代码如下:
- 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。
该参数的具体含义可以参考http://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscopeoption(v=vs.80).aspx
比如下面代码:
- 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();
- }
- }
可以看到,他们的事务id是不一样的。
TransactionScopeOption的属性值:
对于多个不同服务器之间的数据库操作,TransactionScope依赖DTC(Distributed Transaction Coordinator)服务完成事务一致性。
但是对于单一服务器数据,TransactionScope的机制则比较复杂。主要用的的是线程静态特性。线程静态特性ThreadStaticAttribute让CLR知道,它标记的静态字段的存取是依赖当前线程,而独立于其他线程的。既然存储在线程静态字段中的数据只对存储该数据的同一线程中所运行的代码可见,那么,可使用此类字段将其他数据从一个方法传递到该第一个方法所调用的其他方法,而且完全不用担心其他线程会破坏它的工作。TransactionScope 会将当前的 Transaction 存储到线程静态字段中。当稍后实例化 SqlCommand 时(在此 TransactionScope 从线程局部存储中删除之前),该 SqlCommand 会检查线程静态字段以查找现有 Transaction,如果存在则列入该 Transaction 中。通过这种方式,TransactionScope 和 SqlCommand 能够协同工作,从而开发人员不必将 Transaction 显示传递给 SqlCommand 对象。实际上,TransactionScope 和 SqlCommand 所使用的机制非常复杂。
C#中回滚TransactionScope的使用方法和原理的更多相关文章
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 【转载】C#中回滚TransactionScope的使用方法和原理
TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成 实事上,一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完 ...
- 浅析Mysql 数据回滚错误的解决方法
介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下 MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务rollbac ...
- 浅析Mysql数据回滚错误的解决方法
介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下 MYSQL的事务处理主要有两种方法. 1.用begin,rollback,commit来实现 begin 开始一个事 ...
- C#中TransactionScope的使用方法和原理
在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Con ...
- 转:C#中TransactionScope的使用方法和原理
在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Con ...
- 【网摘】C#中TransactionScope的使用方法和原理
时间 2013-08-12 19:59:34 51CTO推荐博文 原文 http://cnn237111.blog.51cto.com/2359144/1271600 在.net 1.1的时代,还 ...
- C#中TransactionScope的使用方法和原理(摘)
出自51CTO博客:http://cnn237111.blog.51cto.com/2359144/1271600 在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务 ...
- SQL Server:在事务中回滚TRUNCATE操作
我们一般都认为TRUNCATE是一种不可回滚的操作,它会删除表中的所有数据以及重置Identity列. 如果你在事务中进行TRUNCATE操作,就能回滚.反之,它就不会从日志文件文件恢复数据.它不会在 ...
随机推荐
- CentOS 7命令行安装GNOME、KDE图形界面
https://www.linuxidc.com/Linux/2018-04/152000.htm
- 使用yum时报错 This system is not registered to Red Hat Subscription Management
错误原因:使用redhat的yum源是需要注册付费的. 1.卸载RedHat自带的yum包 查看已安装的yum rpm -qa|grep yum #卸载已安装的yum rpm -qa | grep y ...
- 011.Docker仓库管理
一 Docker仓库介绍 docker 仓库,即 registry,实现了镜像的管理.分发,同时还包括用户的认证.docker registry 仓库是一个无状态的.高可靠的服务器应用程序,用来存储d ...
- python 中的可变对象与不可变对象
近日辞职待工,没有实际的项目与大家分享.暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑. 首先我们需要明确一个概念,在python中一且皆对象.我们一般定义一个变量a=0,其实质a是 ...
- Java设计模式从精通到入门二 装饰器模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构. 应用实例: 给英雄联盟种的射手,添加不同的装备.先装备攻速 ...
- 在Windows下食用Linux工作环境(WSL+cmder)
在Windows下食用Linux工作环境(WSL+cmder) 为什么要这么瞎搞呢?因为最近换了个硬盘,搞了个双系统,然后习惯性地按下 Ctrl+Alt+T 发现什么都没有召唤出来,然后忽然想起换了系 ...
- [TYVJ1473]校门外的树3
思路: 维护两个树状数组,一个记录种树区间左端点,一个记录右端点. 每次询问查询“看不见的树区间”,即右端点小于查询区间左端点和左端点小于查询区间右端点. #include<cstdio> ...
- NOIP 2006 作业调度方案
[问题描述] 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间. 每个工件的每个工序称为一个操作,我们用记号j-k表示 ...
- BZOJ4460 : [Jsoi2013]广告计划
首先预处理出$f[i][j]$表示第$i$位是字符$j$的字符串集合. 考虑枚举答案$n$,那么模式串中模$n$相同的字符都要按顺序在同一行出现. 设$g[i][j]$表示第$i$列开始出现模$n$为 ...
- 解决CSS图片底部3像素问题总结
解决三像素问题的总结: 1.img标签的父标签增加font-size:0; 如.body{ font-size: 0; } 2.img标签增加display:block; img{display:bl ...