TransactionScope TransactionAbortedException

TransactionScope TransactionAbortedException今天在调试代码的时候遇到一个这样的错误:System.Transactions.TransactionAbortedExceptionwascaughtHResult=-2146233087Message=Thetransactionhasaborted.Source=System.Transactions查了一下原因,主要是由于嵌套事务中,底层事务没有关闭,然…

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

今天在调试代码的时候遇到一个这样的错误:

System.Transactions.TransactionAbortedException was caught
HResult=-2146233087
Message=The transaction has aborted.
Source=System.Transactions

 

查了一下原因,主要是由于嵌套事务中,底层事务没有关闭,然后上层继续使用导致的,不过前提是TransactionScope中使用的是TransactionScopeOption.Required

代码示例:

public void TransactionScopeTest()
        {
            using(TransactionScope ts=new TransactionScope(TransactionScopeOption.Required))
            {
                //do something

                using(TransactionScope tsa=new TransactionScope(TransactionScopeOption.Required))
                {
                    //do A
                    tsa.Complete();
                }

                using (TransactionScope tsb = new TransactionScope(TransactionScopeOption.Required))
                {
                    //do B
                    tsb.Complete();
                }
                ts.Complete();
            }
        }

上述代码时一个TransactionScope内嵌两个TransactionScope,如果tsa.Complete()没有执行,

那么在using (TransactionScope tsb = new TransactionScope(TransactionScopeOption.Required))就会抛出TransactionAbortedException异常:The transaction has aborted

 

所以在使用TransactionScope的时候要注意,嵌套使用的时候,如果出现问题需要尽快的抛出,而不是任由其继续走下去,比如:

public void TransactionScopeTest()
        {
            using(TransactionScope ts=new TransactionScope(TransactionScopeOption.Required))
            {
                //do something
                bool isASuccess = true;
                using(TransactionScope tsa=new TransactionScope(TransactionScopeOption.Required))
                {
                    //do A
                    tsa.Complete();
                }
                if(!isASuccess)
                {
                    return;
                }

                bool isBSuccess = true;
                using (TransactionScope tsb = new TransactionScope(TransactionScopeOption.Required))
                {
                    //do B
                    tsb.Complete();
                }
                if(!isBSuccess)
                {
                    return;
                }

                ts.Complete();
            }
        }

 

转载于:https://www.cnblogs.com/lvjianwei/p/5177447.html

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

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

(0)
上一篇 2022年7月19日 下午10:46
下一篇 2022年7月19日 下午10:46


相关推荐

  • Android组件化方案

    Android组件化方案随着 APP 版本不断的迭代 新功能的不断增加 业务也会变的越来越复杂 APP 业务模块的数量有可能还会继续增加 而且每个模块的代码也变的越来越多 这样发展下去单一工程下的 APP 架构势必会影响开发效率 增加项目的维护成本 每个工程师都要熟悉如此之多的代码 将很难进行多人协作开发 而且 Android 项目在编译代码的时候电脑会非常卡 又因为单一工程下代码耦合严重 每修改一处代码后都要重新编译打包测试 导致非常耗时

    2026年3月26日
    2
  • mac全选文字的快捷键_MACBOOK最全快捷键指南

    mac全选文字的快捷键_MACBOOK最全快捷键指南官方最新出炉的快捷键大全:剪切、拷贝、粘贴和其他常用快捷键Command-X:剪切所选项并拷贝到剪贴板。Command-C:将所选项拷贝到剪贴板。Command-V:将剪贴板的內容粘贴到当前文稿或应用中。Command-Z:撤销前一个命令。随后您可以按Command-Shift-z来重做,从而反向执行撤销命令。Command-A:全选各项。Command-F:查找文稿中的项目或打开“查找”窗口。…

    2022年5月26日
    350
  • Spring集成MyBaties中sqlSessionFactory的创建[通俗易懂]

    Spring集成MyBaties中sqlSessionFactory的创建[通俗易懂]Spring的核心思想就是IOC(InversionOfControl),中文意思就是控制反转,将创建对象的任务交由工厂来处理,同时还可以管理类与类之间的关系,从而提出了依赖注入的概念。先来了解对象的分类:1.简单对象:可以通过new的方式创建的对象,例如UserServiceImle、User类等2.复杂对象:不能通过new的方式创建的对象,例如sqlSessionFact…

    2022年5月18日
    40
  • js中有哪些数据类型_js的五种基本数据类型

    js中有哪些数据类型_js的五种基本数据类型1.数据类型的种类js一共有六种数据类型其中有五种简单数据类型包括:String、Number、Boolean、undefined、Null2.数据类型的检测可以使用typeof来检测数据类型:“undefined”–>这个变量是未定义的(为初始化的变量和未声明的变量的typeof操作都返回undefined)”boolean“–>这个值是布尔值”string“–>这个值是字符串”number“–>这个值是数字”object“–>这个值为null或者obe

    2025年9月21日
    6
  • Laravel 传递数据到视图

    Laravel 传递数据到视图

    2021年10月26日
    42
  • 钉钉 AI 客服:多语言支持方案

    钉钉 AI 客服:多语言支持方案

    2026年3月14日
    2

发表回复

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

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