refactor(version_control): 使用事务处理版本删除逻辑
重构版本删除功能,将数据库操作和文件删除放入事务中处理。当数据库操作失败时自动回滚,文件删除失败则记录错误但不影响事务。提高删除操作的原子性和可靠性。
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user