The transaction associated with this command is not the connections active


1、出现问题原因

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
{
"id": 1,
"infos": [
{
"id": "1",
"name": "小华",
"age": "18"
}
]
},
{
"id": 2,
"infos": []
}
]

2、解决办法

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// ...处理循环信息
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封装有问题导致,重新排查代码,选择直接用自己封装的事务工具类,核心代码如下,自封装工具代码仓库代码量多不在此贴出来,如有需要欢迎评论区或者私信交流。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
_people.BeginTransaction();
try
{
var insertPeople = _people.Insert(peopleInfo);
if(insertPeople)
{
_people.CommitTransaction();
}
else
{
_people.RollBackTransaction();
}
}
catch(Exception ex)
{
_people.RollBackTransaction();
}

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


文章作者: GoodTimeGGB
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 GoodTimeGGB !
评论
  目录