From 8cf0da2f56db49171d9d67187b3b15a90ddba25e Mon Sep 17 00:00:00 2001 From: Leonmmcoset Date: Tue, 23 Sep 2025 17:57:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor(version=5Fcontrol):=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E4=BA=8B=E5=8A=A1=E5=A4=84=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构版本删除功能,将数据库操作和文件删除放入事务中处理。当数据库操作失败时自动回滚,文件删除失败则记录错误但不影响事务。提高删除操作的原子性和可靠性。 --- developer/version_control.php | 79 ++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/developer/version_control.php b/developer/version_control.php index bf52809..ace71dd 100644 --- a/developer/version_control.php +++ b/developer/version_control.php @@ -198,43 +198,64 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_version'])) { // 初始化消息变量 $message = ''; - // 获取文件路径 - $getFilePathSql = "SELECT file_path FROM app_versions WHERE id = ?"; - $getFileStmt = $conn->prepare($getFilePathSql); - if (!$getFileStmt) { - log_error("获取文件路径查询准备失败: " . $conn->error, __FILE__, __LINE__); - $message = '版本删除失败,请稍后再试'; - } else { + // 开始事务 + $conn->begin_transaction(); + + try { + // 1. 获取文件路径 + $filePath = ''; + $getFilePathSql = "SELECT file_path FROM app_versions WHERE id = ?"; + $getFileStmt = $conn->prepare($getFilePathSql); + + if (!$getFileStmt) { + throw new Exception("获取文件路径查询准备失败: " . $conn->error); + } + $getFileStmt->bind_param("i", $versionId); $getFileStmt->execute(); $fileResult = $getFileStmt->get_result(); + if ($fileResult->num_rows > 0) { $fileRow = $fileResult->fetch_assoc(); $filePath = __DIR__ . '/../' . $fileRow['file_path']; - - // 删除文件 - if (file_exists($filePath)) { - if (!unlink($filePath)) { - log_error("文件删除失败: " . $filePath, __FILE__, __LINE__); - $message = '版本删除失败,请稍后再试'; - } + } + + // 2. 从数据库删除版本记录 + $deleteVersionSql = "DELETE FROM app_versions WHERE id = ?"; + $deleteVersionStmt = $conn->prepare($deleteVersionSql); + + if (!$deleteVersionStmt) { + throw new Exception("版本删除查询准备失败: " . $conn->error); + } + + $deleteVersionStmt->bind_param("i", $versionId); + + if (!$deleteVersionStmt->execute()) { + throw new Exception("版本删除执行失败: " . $conn->error); + } + + // 检查是否有记录被删除 + if ($deleteVersionStmt->affected_rows === 0) { + throw new Exception("未找到要删除的版本记录"); + } + + // 3. 如果数据库删除成功,尝试删除文件(即使文件删除失败也不回滚数据库操作) + if (!empty($filePath) && file_exists($filePath)) { + if (!unlink($filePath)) { + log_error("文件删除失败: " . $filePath, __FILE__, __LINE__); + // 文件删除失败不影响数据库操作,继续处理 } } - } - - // 从数据库删除版本记录 - $deleteVersionSql = "DELETE FROM app_versions WHERE id = ?"; - $deleteVersionStmt = $conn->prepare($deleteVersionSql); - if (!$deleteVersionStmt) { - log_error("版本删除查询准备失败: " . $conn->error, __FILE__, __LINE__); - $message = '版本删除失败,请稍后再试'; - } else { - $deleteVersionStmt->bind_param("i", $versionId); - if ($deleteVersionStmt->execute()) { - $message = '版本删除成功'; - } else { - $message = '版本删除失败: ' . $conn->error; - } + + // 提交事务 + $conn->commit(); + $message = '版本删除成功'; + + } catch (Exception $e) { + // 回滚事务 + $conn->rollback(); + log_error("版本删除异常: " . $e->getMessage(), __FILE__, __LINE__); + $message = '版本删除失败: ' . $e->getMessage(); } // 只输出消息,不包含任何HTML