refactor(version_control): 使用事务处理版本删除逻辑

重构版本删除功能,将数据库操作和文件删除放入事务中处理。当数据库操作失败时自动回滚,文件删除失败则记录错误但不影响事务。提高删除操作的原子性和可靠性。
This commit is contained in:
2025-09-23 17:57:33 +08:00
parent 0f5f10e01a
commit 8cf0da2f56

View File

@@ -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