From ec33327408c88d330373ef931354a7a039256d94 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Wed, 14 Jan 2026 11:44:47 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E4=B8=8A=E4=BC=A0=E6=97=B6=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=AD=BB=E9=94=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用 Redis 分布式锁对同一用户往相同父目录的上传请求进行排队, 避免并发上传导致的 MySQL 死锁错误 (SQLSTATE[40001]) --- app/Http/Controllers/Api/FileController.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Api/FileController.php b/app/Http/Controllers/Api/FileController.php index bf8f213e2..aebbc7d93 100755 --- a/app/Http/Controllers/Api/FileController.php +++ b/app/Http/Controllers/Api/FileController.php @@ -14,6 +14,7 @@ use App\Models\User; use App\Models\UserRecentItem; use App\Module\Base; use App\Module\Down; +use App\Module\Lock; use App\Module\Timer; use App\Module\Ihttp; use Response; @@ -763,10 +764,20 @@ class FileController extends AbstractController { $user = User::auth(); $pid = intval(Request::input('pid')); - $overwrite = intval(Request::input('cover')); - $webkitRelativePath = Request::input('webkitRelativePath'); - $data = (new File)->contentUpload($user, $pid, $webkitRelativePath, $overwrite); - return Base::retSuccess($data['data']['name'] . ' 上传成功', $data['addItem']); + // 同一用户往相同父目录上传时排队,避免并发导致数据库死锁 + try { + return Lock::withLock("file:upload:{$user->userid}:{$pid}", function () use ($user, $pid) { + $overwrite = intval(Request::input('cover')); + $webkitRelativePath = Request::input('webkitRelativePath'); + $data = (new File)->contentUpload($user, $pid, $webkitRelativePath, $overwrite); + return Base::retSuccess($data['data']['name'] . ' 上传成功', $data['addItem']); + }, 120000, 120000); + } catch (\Exception $e) { + if (str_contains($e->getMessage(), 'Failed to acquire lock')) { + throw new ApiException('上传繁忙,请稍后再试'); + } + throw $e; + } } /**