System.InvalidOperationException nested transactions are not supported

如下bll方法,在执行时会报事务嵌套异常。bll方法里开启了分布式事务,dal方法里又启动了数据库事务。通过查看异常堆栈,发现异常是在执行BillsDal.Add(bill);方法里的var trans = conn.BeginTransaction();这条语句抛出来的。

持久层框架:dapper, db:mysql。

bll方法:

public static bool AddInterestBill(t_bills bill, t_info_jxdetailed his)
{
    using (var trans = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
    {
        BillsDal.Add(bill);
        his.BillId = bill.BillId;
        BillsDal.AddInterestHis(his);
        trans.Complete();
        return true;
    }
}

dal方法:

/// <summary>
/// 插入记录(启用事务来处理主键BillId)
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public static bool Add(t_bills entity)
{
    if (entity.CreatedTime == DateTime.MinValue)
    {
        entity.CreatedTime = DateTime.Now;
    }

    lock (syncRoot)
    {
        var conn = _conn;
        conn.Open();
        //_conn.setAutoCommit(false);//设置自动事务提交为false
        var trans = conn.BeginTransaction();
        try
        {
            var maxId = conn.ExecuteScalar<long?>("SELECT MAX(BillId) FROM T_Bills;", trans);
            if (maxId == null || maxId < CommonBase.BillId_DefaultValue)
            {
                maxId = CommonBase.BillId_DefaultValue;
            }
            entity.BillId = maxId.Value + 1;

            long i = conn.Insert<long>(entity, trans);
            trans.Commit();
            i = 1; //执行Insert返回值是0,这里给1,以供下面的判断
            return i > 0;
        }
        catch
        {
            trans.Rollback();
            throw;
        }
        finally
        {
            conn.Close();
        }
    }
}

异常截图:

其中:分布式事务TransactionScope的定义为:

IDbConnection的BeginTransaction方法定义为:

时间: 2024-10-27 08:32:40

System.InvalidOperationException nested transactions are not supported的相关文章

hibernate(nested transactions not supported)异常

org.hibernate.TransactionException: nested transactions not supported错误的解决方法! 原因:事务没有提交,事务提交后正常 Transaction tx = session.beginTransaction(); tx.commit(); //缺少这句话

org.hibernate.TransactionException: nested transactions not supported

贴主要部分代码 public PlUser findByUsernameAndPassword(String username, String password) { Session sx = this.getHibernateTemplate().getSessionFactory().openSession(); Transaction tx = sx.getTransaction(); tx.begin(); PlUser user = (PlUser) sx.createQuery("f

.Net 连接FTP下载文件报错:System.InvalidOperationException: The requested FTP command is not supported when using HTTP proxy

系统环境: Windows + .Net Framework 4.0 问题描述: C#连接FTP下载文件时,在部分电脑上有异常报错,在一部分电脑上是正常的:异常报错的信息:System.InvalidOperationException: The requested FTP command is not supported when using HTTP proxy 分析过程: 在网上搜索到的解决方案,基本都是将代理置为null:request.Proxy = null; 并没有解释其原因. 调

.NetCore2.0引用DLL报System.InvalidOperationException: Can not find compilation library location for package &#39;XXX&#39;

.NET CORE 2.0 MVC项目引用类库出现:System.InvalidOperationException: Can not find compilation library location for package 'XXX' 临时解决如下(据说2.0.1会修复):在Startup.cs文件中:修改: public void ConfigureServices(IServiceCollection services) { var mvcBuilder = services.AddMv

“System.InvalidOperationException”类型的未经处理的异常在 ESRI.ArcGIS.AxControls.dll 中发生

问题描述: 新手们进行ArcGIS ArcObject开发时经常会遇到各种十分古怪的问题,比如下面的这个问题: “System.InvalidOperationException”类型的未经处理的异常在 ESRI.ArcGIS.AxControls.dll 中发生 其他信息: ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components. 此时虽然程序能正

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型 的对象时检测到循环引用. 异常信息(部分): System.Web.Services.Protocols.SoapException: 服务器无法处理请求. ---> System.InvalidOperationException: 生成 XML 文档时出错. ---> System.InvalidOperationException: 序列化类型 Web

System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

最近用MVC3 做了一个项目,发布时项目的中的数据导入功能(Excel格式,有固定的导入数据模板)居然不能用,查看报错日志,发现是“System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序............”. 在网上找一些资料,把问题解决了.如下图所示. 后台功能代码:导入与导出实现代码. 1 #region -使用IO写入Excel- 2 /// <summary> 3 /// 使用IO写入E

线程使用中常见的错误-“System.InvalidOperationException”线程间操作无效: 从不是创建控件“ ”的线程访问它。

"System.InvalidOperationException"类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: 从不是创建控件"label1"的线程访问它. 解决方法: 1 构造方法中添加 CheckForIllegalCrossThreadCalls = false; 2 方法二 invoke label1.Invoke(new Action<string>((str) => {

异常详细信息: System.InvalidOperationException: 对象的当前状态使该操作无效 真正的解决办法

源错误: 执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 堆栈跟踪: [InvalidOperationException: 对象的当前状态使该操作无效.] System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded() +2692482 System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[] b