删除一个大型文档子树仍然会对每个子节点发出一次更新
作者: 47star创建于 2026年8月29日更新于 2026年8月30日
标签bugperformance
这个问题存在吗?
我搜索了现有的问题
QQ 这与配置大纲无关
- 这个问题与自我接待配置无关
当前的行为
删除文档也会软删除其所有后人. 当文档有大型子树时,删除请求可能会在操作完成前超时或返回网关错误.
子树在一个递归式查询中解决了,但后人被一次装入并被摧毁一个. 因此,有 N 子树仍然在请求交易中执行 N 软删除更新 。
如果达到请求或数据库超时,则交易会回滚并保持文档未被删除.
• 预期行为
删除有大量后人的文件,应当完成,且不能超过请求的超时,或者发布每个后人一次更新.
- 创建或导入有大量后代的文件。
- 删除根文档。
- 观察删除请求的期限和数据库查询。
- 如果子树足够大, 请求时间会超出或返回网关错误 。
环境
- 大纲:目前的 " 主要 "
- 数据库:PostgreSQL
还有别的吗?
#13311将树下取景减少为递归式查询,但有意保留个人的"Destroy ()"电话,以便每个后代的模型钩跑.
这就留下了剩下的软删除更新作为仍然能与后代数量相适应的部分. 以批量更新取代它们将解决查询数,但也会跳过实例级的破坏钩. #13484目前依靠其中一个钩来记录"被删除的ById".
我可以看到的替代办法是:
- 分批更新后代,并明确保留必要的删除字段。
- 保持现有的破坏行为,但处理后代同步的分批处理。
- 将大宗数据库更新与每个文件的可重试副作用分开。
在准备修改之前, 我先讨论这个问题, 因为适当的修补取决于删除周期行为需要保持同步.
内容来源: outline/outline