PHP操作MySQL事务实例:使用mysqli与原生SQL执行
在PHP开发中,确保数据操作的原子性和一致性至关重要。本文将通过具体的代码实例,讲解如何利用PHP操作MySQL事务,详细解析基于mysqli扩展和原生SQL语句的执行流程,并说明不同存储引擎(如InnoDB)对事务的支持差异。
MySQL事务核心概念
在进行编码之前,理解事务的ACID特征是实现正确业务逻辑的基础:
- 原子性 (Atomic): 事务作为一个整体,要么全部成功,要么全部失败。例如银行转账时,扣款和入账必须同时完成,不能只执行其中一步。
- 一致性 (Consistent): 事务执行前后,数据库必须处于一致状态。转账后总金额保持不变。
- 隔离性 (Isolated): 多个并发事务之间互不干扰,看不到其他事务未提交的中间状态。
- 持续性 (Durable): 一旦事务提交,其对数据库的修改就是永久性的,即使系统发生故障也不会丢失。
准备工作与环境配置
在执行事务前,需确认以下前提条件:
- 数据库引擎: 必须使用支持事务的引擎,通常是
InnoDB。MyISAM等引擎不支持事务,仅适用于读多写少的场景。 - 连接对象: 根据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数据库编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









