PHP操作MySQL事务实例:使用mysqli与原生SQL执行

向北走
向北走
发布时间:2026-10-14| 5人浏览过
原创

在PHP开发中,确保数据操作的原子性和一致性至关重要。本文将通过具体的代码实例,讲解如何利用PHP操作MySQL事务,详细解析基于mysqli扩展和原生SQL语句的执行流程,并说明不同存储引擎(如InnoDB)对事务的支持差异。

MySQL事务核心概念

在进行编码之前,理解事务的ACID特征是实现正确业务逻辑的基础:

  • 原子性 (Atomic): 事务作为一个整体,要么全部成功,要么全部失败。例如银行转账时,扣款和入账必须同时完成,不能只执行其中一步。
  • 一致性 (Consistent): 事务执行前后,数据库必须处于一致状态。转账后总金额保持不变。
  • 隔离性 (Isolated): 多个并发事务之间互不干扰,看不到其他事务未提交的中间状态。
  • 持续性 (Durable): 一旦事务提交,其对数据库的修改就是永久性的,即使系统发生故障也不会丢失。

准备工作与环境配置

在执行事务前,需确认以下前提条件:

  1. 数据库引擎: 必须使用支持事务的引擎,通常是 InnoDB。MyISAM 等引擎不支持事务,仅适用于读多写少的场景。
  2. 连接对象: 根据PHP版本和偏好,可选择使用 mysqli 面向对象接口或旧版的 mysql_* 函数系列(注:新版PHP已废弃mysql扩展,推荐优先使用mysqli或PDO)。

第1步:使用mysqli扩展处理事务

mysqli 类封装了事务相关的方法,使用直观且易于管理。以下是标准的转账示例代码:

$sql1 = "UPDATE User SET ScoreCount = ScoreCount + 10 WHERE ID = '123456'";
$sql2 = "UPDATE ScoreDetail SET FScore = 300 WHERE ID = '123456'";

// 1. 建立连接
$mysqli = new mysqli('localhost', 'root', '', 'DB_Lib2Test');

// 检查连接是否成功
if ($mysqli->connect_error) {
    die('Connection failed: ' . $mysqli->connect_error);
}

// 2. 关闭自动提交模式,开始事务
$mysqli->autocommit(false);

// 3. 执行SQL语句
$result1 = $mysqli->query($sql1);
$result2 = $mysqli->query($sql2);

// 4. 判断是否有错误发生
if (!$mysqli->errno) {
    // 无错误,提交事务
    $mysqli->commit();
    echo 'Transaction committed successfully.';
} else {
    // 有错误,回滚事务,恢复数据原状
    $mysqli->rollback();
    echo 'Transaction rolled back due to error: ' . $mysqli->error;
}

关键点说明:

  • autocommit(false):关闭自动提交,意味着后续的每条SQL语句都不会立即生效,直到调用 commit()。
  • errno:用于检测上一次查询是否出错。若出错,直接触发 rollback(),撤销之前的所有更改。

第2步:使用原生SQL语句处理事务

虽然现代开发更推荐面向对象方式,但在某些场景下直接使用SQL命令也是一致的选择。以下示例展示了如何通过发送SQL命令来启停事务:

// 假设 $conn 已通过 mysql_connect 建立连接
$conn = mysql_connect('localhost', 'root', '');
mysql_select_db('DB_Lib2Test');

// 1. 显式开启事务
mysql_query('START TRANSACTION');

// 或者等价于:
// mysql_query('SET autocommit = 0');

$sql1 = "UPDATE User SET ScoreCount = ScoreCount + 10 WHERE ID = '123456'";
$sql2 = "UPDATE ScoreDetail SET FScore = 300 WHERE ID = '123456'";

// 2. 执行SQL
$res1 = mysql_query($sql1);
$res2 = mysql_query($sql2);

// 3. 检查结果
if (mysql_errno()) {
    // 发生错误,回滚
    mysql_query('ROLLBACK');
    echo 'Error occurred. Transaction rolled back.';
} else {
    // 成功,提交
    mysql_query('COMMIT');
    echo 'Operation completed successfully.';
}

// 4. (可选)重置自动提交为默认状态
// mysql_query('SET autocommit = 1');

注意:此方法依赖旧的 mysql_* 函数库,在现代PHP环境中不再建议使用,但有助于理解事务在底层是通过特定的SQL指令(START TRANSACTION, COMMIT, ROLLBACK)控制的。

注意事项与排错指南

  • 引擎检查: 如果报错提示不支持事务,请检查表结构是否为 InnoDB。可通过 SHOW TABLE STATUS LIKE 'TableName' 查看Type字段。
  • 异常处理: 在生产环境中,建议结合 try-catch 块或使用 set_error_handler 来捕获潜在的数据库错误,避免程序崩溃导致事务悬而未决。
  • 性能考虑: 长时间持有事务锁会影响并发性能。应尽量缩短事务内的操作时间,避免在事务中执行耗时过长的逻辑或非数据库操作。
  • 自动提交重置: 在使用完 SET autocommit=0 后,记得在最后将其重置为 1,否则后续非事务性操作也会受到影响,可能导致不可预期的行为。

总结

通过上述示例可以看出,无论是使用面向对象还是面向过程的PHP方式,核心逻辑均遵循“关闭自动提交 -> 执行操作 -> 校验结果 -> 提交/回滚”的流程。正确使用事务能有效保障业务数据的完整性。以上就是PHP操作MySQL事务实例的详细内容,更多关于PHP数据库编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。