PHP MySQL 事务处理示例与注意事项

Mason
Mason
发布时间:2026-10-13| 5人浏览过
原创

本文详细讲解了在 PHP 环境中如何调用 MySQL 原生接口执行事务操作,包括开启事务、执行 SQL 语句、判断错误后回滚以及最终提交。文章同时分析了旧版 mysql_* 函数的局限性、InnoDB 表的必要性以及事务嵌套时的回滚机制陷阱,为理解数据库事务原理提供基础实例。

事务处理的基本流程

在关系型数据库中,事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作,这些操作要么完全成功,要么完全失败。在 PHP 中,若要使用事务,通常需要通过 SQL 命令显式控制。以下是基于传统 mysql_* 扩展的事务处理典型步骤:

第1步:建立数据库连接

首先需要连接到数据库服务器并选择目标数据库。注意,以下示例使用的是已废弃的 mysql_connect 函数,仅用于演示语法结构。现代开发推荐使用 mysqli 或 PDO。

<?php
$conn = mysql_connect('localhost', 'root', '');
mysql_select_db('test', $conn);
mysql_query("SET NAMES GBK");
?>

第2步:开启事务

在执行一系列数据库修改操作前,必须明确告诉数据库进入事务模式。通过执行 START TRANSACTION 语句实现。

mysql_query('START TRANSACTION');
$isBad = 0;
$ins_testTable1 = "INSERT INTO testtable1(NAME,age)VALUES('first',23)";

第3步:执行业务 SQL 并检查状态

依次执行预期的插入或更新语句。由于旧版 mysql_query 返回布尔值,需手动记录是否发生错误。示例中尝试向表中插入两条数据,其中第二条故意包含字段名错误以触发异常。

// 正常插入
if(!mysql_query($ins_testTable1)){
  $isBad = 1;
}
// 错误插入:字段 ages 不存在
$ins_testTable2 = "INSERT INTO testtable1(NAME,ages)VALUES('second','24')";
if(!mysql_query($ins_testTable2)){
  $isBad = 1;
}

第4步:根据结果决定回滚或提交

若中间任何一步出错($isBad == 1),则执行 ROLLBACK 撤销所有在 START TRANSACTION 之后执行的更改;若全部成功,则执行 COMMIT 永久保存更改。

if($isBad == 1){
  echo "Error occurred, rolling back...";
  mysql_query('ROLLBACK');
}
mysql_query('COMMIT');
mysql_close($conn);

关键注意事项与技术陷阱

1. 存储引擎必须是 InnoDB

只有支持事务的存储引擎(如 MySQL 的 InnoDB)才能使用事务功能。如果使用默认的 MyISAM 表,上述 SQL 语句虽不会报错,但不会产生实际的事务保护效果。

2. 多次回滚的执行逻辑

原文注释指出:“如果一段事务中出现多次回滚事务,则在提交事务时只将第一次回滚前至开始事务后对数据库的所有操作取消”。这是一个常见的误区或特定版本行为描述。在标准的 SQL 事务模型中:

  • 一旦执行了 ROLLBACK,当前事务即告结束,之前的所有更改被撤销。
  • 后续再执行 ROLLBACK 或 COMMIT 通常会报错,因为当前没有活跃事务。
  • 如果代码逻辑是在同一次请求中连续发出多个 ROLLBACK 而没有重新开启事务,第二次回滚通常无效或引发错误。
因此,最佳实践是仅在检测到错误后执行**一次** ROLLBACK,随后直接 COMMIT(在自动提交模式下可能跳过,但在显式事务块中 COMMIT 用于结束当前空事务或保持状态一致,具体取决于驱动实现,通常回滚后直接关闭或结束即可)。

3. 未提交事务的后果

如果开启了事务但未执行 COMMIT,且脚本正常结束或遇到下一次 START TRANSACTION,不同数据库驱动行为可能不同。通常,如果没有显式提交,更改会被隐式回滚。但这依赖于具体的客户端库配置(如 autocommit 设置)。显式管理 COMMIT 和 ROLLBACK 是最安全的做法。

4. 关于已弃用的 API

示例中使用的 mysql_* 系列函数在 PHP 5.5.0 中已被废弃,并在 PHP 7.0.0 中被移除。在实际项目中,请使用以下替代方案实现更健壮的事务处理:

  • Mysqli 过程化方式:mysqli_begin_transaction(), mysqli_commit(), mysqli_rollback()。
  • PDO 方式:$pdo->beginTransaction(), $pdo->commit(), $pdo->rollBack()。

总结

掌握 PHP 中的事务处理是保障数据完整性的关键技能。核心在于正确组合 START TRANSACTION、ROLLBACK 和 COMMIT 三条指令,并确保底层表支持事务特性。虽然原始示例使用了老旧的 MySQL 扩展,但其体现的逻辑流对于理解任何现代数据库 ORM 或连接库的事务抽象都是通用的。

以上就是 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 算法库。