The transaction associated with this command is not the connection‘s active

178 阅读1分钟

1、出现问题原因

接口接收入参为数组类型,遍历数组操作时,事务写在了循环里,待下一次循环时事务非此连接的事务导致出现如题错误,接口传参数组形式如下:

[



    {



        "id": 1,



        "infos": [



            {



                "id": "1",



                "name": "小华",



                "age": "18"



            }



        ]



    },



    {



        "id": 2,



        "infos": []



    }



]

2、解决办法

将循环中需要更新的数据放入到列表中,在循环外用事务执行批量更新,以此使事务处于连接的活动事务中即可。部分示例代码如下:

// ...处理循环信息



var trans = _people.BeginTransaction();



try



{



    // 更新人员信息



    var updatePeople = _people.UpdateRange(updatePeopleInfoList);



    if(updatePeopleInfoList.Count == 0) updatePeople = true;



    // 更新人员附属信息



    var updatePeopleItem = _peopleItem.UpdateRange(updatePeopleItemList);



    if(updatePeopleItemList.Count == 0) updatePeopleItem = true;



    if(updatePeople && updatePeopleItem)



    {



        trans.Commit();



        _logger.LogDebug($ "[更新人员信息成功]", "111111");



    }



    else



    {



        trans.Rollback();



        _logger.LogError($ "[更新人员信息失败]{args.ToJson()}");



        return ErrorResult < long > ($ "更新人员信息失败", "111112");



    }



}



catch(Exception ex)



{



    trans.Rollback();



    _logger.LogError($ "[更新人员信息失败]{ex}", ex.Message);



    return ErrorResult < long > ("系统繁忙,请重新获取", "111150");



}

——————————————————————————————————————————

2023-4-18 更新

上述代码采用IDbTransaction事务,可能是IDbTransaction封装有问题导致,重新排查代码,选择直接用自己封装的事务工具类,核心代码如下,自封装工具代码仓库代码量多不在此贴出来,如有需要欢迎评论区或者私信交流。

 _people.BeginTransaction();



 try



 {



     var insertPeople = _people.Insert(peopleInfo);



     if(insertPeople)



     {



         _people.CommitTransaction();



     }



     else



     {



         _people.RollBackTransaction();



     }



 }



 catch(Exception ex)



 {



     _people.RollBackTransaction();



 }

若本文有帮助到阅读本文的同学,欢迎点赞、关注、收藏,互相学习交流。