PHP mysqli_rollback() 函数(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在 PHP 开发中,数据库操作是核心场景之一。当需要执行多个数据库操作时,确保操作的原子性和一致性至关重要。例如,在电商系统中,用户下单扣减库存并记录订单信息,如果其中一个步骤失败,就需要回滚所有操作,避免数据不一致。此时,mysqli_rollback() 函数便成为实现这一目标的关键工具。本文将深入解析该函数的功能、使用场景及实际案例,帮助开发者掌握事务管理的核心技巧。


一、事务处理基础概念

1.1 事务的定义与作用

事务(Transaction)是数据库操作的逻辑单元,它确保一组操作要么全部成功执行,要么全部失败回滚。事务遵循 ACID 四大特性:

  • Atomicity(原子性):事务中的所有操作要么全部完成,要么全部不执行。
  • Consistency(一致性):事务完成后,数据库状态必须符合业务规则。
  • Isolation(隔离性):并发事务之间互不干扰。
  • Durability(持久性):事务提交后,结果永久保存。

1.2 PHP 中的事务支持

PHP 通过 MySQLiPDO 扩展实现事务控制。使用 mysqli_rollback() 需满足以下条件:

  • 存储引擎支持事务:如 InnoDB(默认支持),而 MyISAM 不支持。
  • 事务未被自动提交:需显式关闭自动提交模式。

二、mysqli_rollback() 函数详解

2.1 函数语法与参数

mysqli_rollback() 的语法如下:

bool mysqli_rollback(mysqli $link)
  • 参数$link 是通过 mysqli_connect()mysqli_init() 创建的数据库连接对象。
  • 返回值:成功返回 true,失败返回 false

2.2 函数作用与工作原理

mysqli_rollback() 的核心作用是 撤销事务开始后所有未提交的数据库操作。其工作流程如下:

  1. 调用 mysqli_autocommit($link, false) 关闭自动提交。
  2. 执行多个数据库操作(如 INSERTUPDATE)。
  3. 若发生错误,调用 mysqli_rollback() 撤销所有操作。
  4. 若无错误,调用 mysqli_commit() 提交事务。

形象比喻

将事务比作快递包裹的打包过程。如果打包过程中发现商品损坏,mysqli_rollback() 就像按下“退回”按钮,将包裹恢复到打包前的状态。


三、与相关函数的对比与协作

3.1 mysqli_commit() vs. mysqli_rollback()

  • mysqli_commit():提交事务,永久保存所有操作。
  • mysqli_rollback():回滚事务,撤销所有未提交的操作。

协作示例

// 关闭自动提交
mysqli_autocommit($conn, false);

try {
    // 执行多个 SQL 操作
    mysqli_query($conn, "INSERT INTO orders ...");
    mysqli_query($conn, "UPDATE products SET stock = stock - 1 ...");
    
    // 提交事务
    mysqli_commit($conn);
} catch (Exception $e) {
    // 回滚事务
    mysqli_rollback($conn);
    echo "事务失败,已回滚!";
}

3.2 mysqli_begin_transaction() 的使用

PHP 7.4 引入了 mysqli_begin_transaction(),提供更简洁的事务管理方式:

// 开启事务并设置隔离级别
mysqli_begin_transaction($conn, MYSQLI_TRANS_START_READ_WRITE);

try {
    // 数据库操作...
    mysqli_commit($conn);
} catch (Exception $e) {
    mysqli_rollback($conn);
}

四、实际案例:用户注册与积分扣除

4.1 场景描述

假设用户注册时需完成以下操作:

  1. 插入用户信息到 users 表。
  2. 扣除用户账户的积分(如注册赠送积分)。

若步骤 2 失败(例如积分不足),需撤销步骤 1 的插入操作。

4.2 代码实现

<?php
// 连接数据库
$conn = mysqli_connect("localhost", "user", "password", "mydb");

// 关闭自动提交
mysqli_autocommit($conn, false);

try {
    // 插入用户信息
    $insertUser = mysqli_query($conn, "INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com')");
    
    // 扣除积分
    $updatePoints = mysqli_query($conn, "UPDATE users SET points = points - 100 WHERE id = LAST_INSERT_ID()");
    
    // 检查是否有错误
    if (!$insertUser || !$updatePoints) {
        throw new Exception("操作失败");
    }
    
    // 提交事务
    mysqli_commit($conn);
    echo "注册成功!";
} catch (Exception $e) {
    // 回滚事务
    mysqli_rollback($conn);
    echo "注册失败,已回滚!";
}

// 释放连接
mysqli_close($conn);
?>

4.3 关键点解析

  1. LAST_INSERT_ID() 的使用:通过获取刚插入的用户 id,确保积分扣除操作作用于正确记录。
  2. 错误检查:通过 if (!$insertUser || !$updatePoints) 捕获 SQL 执行失败的情况。
  3. 资源释放:无论事务是否成功,均需调用 mysqli_close() 释放连接。

五、常见问题与最佳实践

5.1 常见问题

问题描述解决方案
调用 mysqli_rollback() 后无反应检查是否已关闭自动提交(mysqli_autocommit())。
回滚后数据未恢复确认存储引擎为 InnoDB(可通过 SHOW TABLE STATUS 查看)。
事务嵌套导致错误MySQL 默认不支持事务嵌套,需通过 SAVEPOINT 机制实现。

5.2 最佳实践

  1. 错误处理:在事务中使用 try-catch 块,或通过 mysqli_error() 捕获异常。
  2. 资源管理:事务完成后及时释放连接,避免数据库连接泄漏。
  3. 测试环境:在开发阶段通过模拟错误(如故意触发 SQL 错误)验证回滚逻辑。

六、结论

mysqli_rollback() 是 PHP 开发中保障数据一致性的核心工具,尤其在涉及多步骤数据库操作的场景中不可或缺。通过关闭自动提交、合理使用 try-catch 块以及结合 mysqli_commit(),开发者可以轻松实现事务的原子性控制。

本文通过代码示例和实际案例,展示了如何将理论转化为实践。建议读者在项目中逐步引入事务管理,以提升系统的健壮性。无论是初学者还是中级开发者,掌握这一函数都将显著提升复杂业务场景下的代码质量。


通过本文的学习,您已掌握了 PHP mysqli_rollback() 函数 的核心原理与应用方法。在后续开发中,不妨尝试将其融入用户权限管理、支付系统等场景,进一步巩固对事务的理解与实践能力。

最新发布