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(); }
|
若本文有帮助到阅读本文的同学,欢迎点赞、关注、收藏,互相学习交流。