1、出现问题原因
接口接收入参为数组类型,遍历数组操作时,事务写在了循环里,待下一次循环时事务非此连接的事务导致出现如题错误,接口传参数组形式如下:
代码语言:javascript复制[
{
"id": 1,
"infos": [
{
"id": "1",
"name": "小华",
"age": "18"
}
]
},
{
"id": 2,
"infos": []
}
]
2、解决办法
将循环中需要更新的数据放入到列表中,在循环外用事务执行批量更新,以此使事务处于连接的活动事务中即可。部分示例代码如下:
代码语言:javascript复制// ...处理循环信息
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封装有问题导致,重新排查代码,选择直接用自己封装的事务工具类,核心代码如下,自封装工具代码仓库代码量多不在此贴出来,如有需要欢迎评论区或者私信交流。
代码语言:javascript复制 _people.BeginTransaction();
try
{
var insertPeople = _people.Insert(peopleInfo);
if(insertPeople)
{
_people.CommitTransaction();
}
else
{
_people.RollBackTransaction();
}
}
catch(Exception ex)
{
_people.RollBackTransaction();
}