码迷,mamicode.com
首页 > 其他好文 > 详细

System.InvalidOperationException nested transactions are not supported

时间:2017-01-10 13:22:38      阅读:345      评论:0      收藏:0      [点我收藏+]

标签:back   color   insert   nop   tail   判断   res   exec   rom   

如下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方法定义为:

技术分享

 

System.InvalidOperationException nested transactions are not supported

标签:back   color   insert   nop   tail   判断   res   exec   rom   

原文地址:http://www.cnblogs.com/buguge/p/6268726.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!