跳到主要内容
版本:Next

排序调整

本文档中引用的文件

目录

  1. 引言
  2. 实体排序字段的作用
  3. 排序调整方法实现原理
  4. 并发环境下的数据竞争与应对策略
  5. 前端调用建议与批量提交优化
  6. 结论

引言

本文档详细阐述了系统中 MyEntityName 实体排序功能的实现机制。重点分析 Sort 字段在列表展示中的作用,解析 AdjustSortAsync 方法如何接收目标实体 ID 与目标排序值,重新计算相关实体的排序值,并确保排序的连续性与唯一性。同时讨论在高并发场景下可能引发的数据竞争问题及应对策略,并提供前端拖拽排序后的优化调用建议。

Section sources

实体排序字段的作用

MyEntityName 实体中的 Sort 字段(类型为 int)用于定义实体在列表中的显示顺序。该字段在数据库表中被映射为 sort 列,并作为默认排序依据,确保列表展示时具有稳定的顺序。

在查询接口 GetListAsync 中,若未指定排序规则,则默认按 Sort 字段升序排列,从而保证用户界面中列表项始终按照预设顺序展示。此字段的连续性和唯一性由业务逻辑维护,避免出现重复或空缺的排序值。

Diagram sources

Section sources

排序调整方法实现原理

AdjustSortAsync 方法是实现排序调整的核心逻辑,位于 MyEntityNameAppService 类中。其工作流程如下:

  1. 获取全部实体列表:首先从仓储中获取所有 MyEntityName 实体,并按当前 Sort 值升序排列。
  2. 初始化连续排序:遍历列表,为每个实体分配从 1 开始的连续序号,确保排序值的连续性。
  3. 定位目标实体:根据传入的 id 找到目标实体。
  4. 调整排序区间
    • 若目标排序为 1,则其他所有实体排序值整体加 1。
    • 若原排序大于目标排序(向上移动),则位于目标位置及以上(不含自身)的实体排序 +1,其余 -1。
    • 若原排序小于目标排序(向下移动),则位于目标位置以上(不含自身)的实体排序 +1,其余 -1。
  5. 设置目标排序值:将目标实体的 Sort 设置为指定值。
  6. 批量更新数据库:调用 UpdateManyAsync 一次性提交所有实体的排序变更。

此算法确保了排序的连续性(无空缺)和唯一性(无重复),并通过批量更新减少数据库交互次数。

Diagram sources

Section sources

并发环境下的数据竞争与应对策略

在高并发场景下,多个用户同时调整排序可能导致数据竞争问题。典型场景如下:

  • 用户 A 和 B 同时加载相同列表
  • 用户 A 将项目 1 移动到位置 3
  • 用户 B 将项目 2 移动到位置 3
  • 由于两者基于旧数据计算排序,最终结果可能出现重复排序值或顺序错乱

应对策略

1. 数据库行锁(推荐)

GetListAsync 查询时使用 FOR UPDATE 锁定相关记录,防止其他事务读取未提交数据。EF Core 可通过 ExecuteSqlRaw 或自定义 Dapper 查询实现。

2. 应用层分布式锁

使用 Redis 等中间件实现分布式锁,以实体集合为锁键,在 AdjustSortAsync 执行期间加锁,确保同一时间只有一个请求能修改排序。

3. 乐观并发控制

MyEntityName 实体中引入 ConcurrencyStamp 字段(已存在),每次更新时校验版本号。若版本不一致则抛出异常,前端提示用户刷新后重试。

当前实现未显式处理并发,建议在高并发场景下补充上述任一锁机制。

Section sources

前端调用建议与批量提交优化

为提升用户体验与系统性能,建议前端采用以下策略:

拖拽排序优化方案

  1. 本地预览:用户拖拽时,前端先在本地更新排序并实时渲染,提供即时反馈。
  2. 延迟提交:设置防抖(debounce)机制(如 500ms),避免频繁请求。
  3. 批量提交:若支持多项目排序,收集所有变更后一次性调用批量接口(可扩展 AdjustSortAsync 支持批量)。
  4. 错误重试:若因并发冲突失败,提示用户“数据已变更,请刷新后重试”。

接口扩展建议

可新增批量调整接口:

Task AdjustSortBatchAsync(List<(Guid id, int sort)> items);

减少网络往返,提升性能。

Section sources

结论

MyEntityName 实体的排序功能通过 Sort 字段实现,AdjustSortAsync 方法确保了排序的连续性与唯一性。当前实现逻辑清晰,但在高并发场景下存在数据竞争风险,建议引入数据库行锁或分布式锁机制。前端应采用防抖与批量提交策略优化用户体验。未来可扩展批量接口以进一步提升性能。