From 612f24d5f12a9afbe8adc9ff882daaf6ef85d84a Mon Sep 17 00:00:00 2001 From: wangzhibiao Date: Mon, 21 Sep 2026 21:21:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=93=E8=AE=AD=EF=BC=9A?= =?UTF-8?q?=E9=94=81=E5=AE=9A=E5=8F=82=E8=AE=AD=E8=AE=B0=E5=BD=95=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E7=BB=93=E8=AE=AD=E5=B9=B6=E5=8F=91=E7=AB=9E=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../train/service/impl/EnrollmentPlanCompletionAdapter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/EnrollmentPlanCompletionAdapter.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/EnrollmentPlanCompletionAdapter.java index 7ffbf910e..62c3fda4a 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/EnrollmentPlanCompletionAdapter.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/EnrollmentPlanCompletionAdapter.java @@ -41,6 +41,10 @@ public class EnrollmentPlanCompletionAdapter implements PlanEnrollmentCompletion @Override public void precheckCompletion(String planId) { + // 按 enrollment_id 稳定升序锁定该计划下全部学员记录 (SELECT ... ORDER BY enrollment_id FOR UPDATE), + // 阻止结训与学员报到/状态修改之间的并发竞态与 TOCTOU 窗口 + trainEnrollmentService.selectEnrollmentsForUpdateByPlanId(planId); + List> stats = trainEnrollmentService.selectEnrollmentCompletionStatsByPlanId(planId); int status0Waiting = 0; int status1Reported = 0;