TransactionScope事务处理

TransactionScope事务处理在我们日常开发的时候,有时候程序需要使用到事务,就比如,我们日常最熟悉的一个流程,那么就是银行的取款,当用户从ATM机器选择取款1000元的时候,恰巧这个时候如果停电,如果没有事务那么将会出现不堪设想的后果,银行都会倒闭。最近在开发一个功能,需要根据单据的信息生成2张单据,要么全部保存,要么都保存失败,做到事务的一致性、原子性,一开始我想到的是SQL和存储过程级别的事务,但是好像按照当前的系统的业务逻辑,这个方法的底层还是拼接SQL语句,后面又想着使用C#的ADO.NET级别的事务,根据数据生成sql,但

大家好,又见面了,我是你们的朋友全栈君。

在我们日常开发的时候,有时候程序需要使用到事务,就比如,我们日常最熟悉的一个流程,那么就是银行的取款,当用户从ATM机器选择取款1000元的时候,恰巧这个时候如果停电,如果没有事务那么将会出现不堪设想的后果,银行都会倒闭。
最近在开发一个功能,需要根据单据的信息生成2张单据,要么全部保存,要么都保存失败,做到事务的一致性、原子性,一开始我想到的是SQL和存储过程级别的事务,但是好像按照当前的系统的业务逻辑,这个方法的底层还是拼接SQL语句,后面又想着使用C#的ADO.NET级别的事务,根据数据生成sql,但是最后并不认可这种做法。

在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的。这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入。
那么有没有一种方法可以将我们所写的代码都概括成一个事务,要么成功,要么失败呢?

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类是可以嵌套使用,如果要嵌套使用,需要在嵌套事务块中指定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();
            }
        }

在这里记录一下,以后使用事务方面可以看到这篇文章,给自己记录一个成长点

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161953.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最新tracker服务器网站_服务器网速测试

    最新tracker服务器网站_服务器网速测试Tracker服务器是对于BT下载必须的,网上随便搜索一下就有很多Tracker服务器列表,一个服务器文件少则几十个,多则上百个,但”杂乱无章”,要不就是用不了,要不就是在中不可用,要不就是重复,真正能用的就比较少了。提供的服务器在中国都ping得通,每24小时自动更新,自动检测,从几个百服务器筛选出在中国可通的服务器列表。[下载中国可用Tracker服务器列表-每24小时更新]提供的服务…

    2022年10月1日
    6
  • pycharm激活码最新2022.01(JetBrains全家桶)「建议收藏」

    (pycharm激活码最新2022.01)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月1日
    207
  • C# 简单封装一个XML文件读取类

    C# 简单封装一个XML文件读取类

    2021年8月13日
    42
  • verycd下载办法_不提供是什么意思

    verycd下载办法_不提供是什么意思现在verycd不提供下载了,我们少了一个重要的资源下载地址。以前是影视剧不能下载,现在是所有东西全部不可以下载。难道我们没有其他方可以下载吗?还是有的,而且比verycd开放的功能还多。verycd不提供下载的解决办法:simplecd还可以提供下载,甚至影视剧也可以下载。SimpleCD专注于为VeryCD做简单的备份,同时也提供了基本的搜索和列

    2022年8月10日
    7
  • HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 解读

    HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 解读

    2021年12月31日
    47
  • 杭州电信域名解析服务器,浙江电信的DNS是多少?

    杭州电信域名解析服务器,浙江电信的DNS是多少?1、湖州、嘉兴、绍兴、舟山202.101.172.362、金华、衢州、丽水、台州202.101.172.373、温州202.96.104.164、宁波202.96.104.155、杭州202.101.172.35行政区域名行政区域名是按照我国的各个行政区划分而成的,其划分标准依照国家技术监督局发布的国家标准而定,包括“行政区域名”34个,适用于我国的各省、自治区、直辖市,分别为:BJ-北京市;SH…

    2022年7月11日
    40

发表回复

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

关注全栈程序员社区公众号