php实现事务控制
PHP 实现事务控制的方法
在 PHP 中,事务控制通常用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID)。以下是使用 PDO 和 MySQLi 扩展实现事务控制的详细方法。

使用 PDO 实现事务控制
PDO(PHP Data Objects)是 PHP 的一个数据库访问抽象层,支持多种数据库。以下是 PDO 实现事务的步骤:
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 开始事务
$pdo->beginTransaction();
// 执行 SQL 语句
$pdo->exec("INSERT INTO users (name, email) VALUES ('John', 'john@example.com')");
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
// 提交事务
$pdo->commit();
echo "事务提交成功";
} catch (PDOException $e) {
// 回滚事务
$pdo->rollBack();
echo "事务失败: " . $e->getMessage();
}
beginTransaction():开始一个新事务。commit():提交事务,所有操作生效。rollBack():回滚事务,撤销所有操作。
使用 MySQLi 实现事务控制
MySQLi 是 PHP 的 MySQL 扩展,支持面向对象和面向过程的编程风格。以下是 MySQLi 实现事务的步骤:
面向对象风格
$mysqli = new mysqli("localhost", "username", "password", "test");
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
// 关闭自动提交
$mysqli->autocommit(false);
try {
$mysqli->query("INSERT INTO users (name, email) VALUES ('Jane', 'jane@example.com')");
$mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2");
// 提交事务
$mysqli->commit();
echo "事务提交成功";
} catch (Exception $e) {
// 回滚事务
$mysqli->rollback();
echo "事务失败: " . $e->getMessage();
}
$mysqli->close();
面向过程风格
$link = mysqli_connect("localhost", "username", "password", "test");
if (!$link) {
die("连接失败: " . mysqli_connect_error());
}
// 关闭自动提交
mysqli_autocommit($link, false);
try {
mysqli_query($link, "INSERT INTO users (name, email) VALUES ('Mike', 'mike@example.com')");
mysqli_query($link, "UPDATE accounts SET balance = balance - 50 WHERE user_id = 3");
// 提交事务
mysqli_commit($link);
echo "事务提交成功";
} catch (Exception $e) {
// 回滚事务
mysqli_rollback($link);
echo "事务失败: " . $e->getMessage();
}
mysqli_close($link);
autocommit(false):关闭自动提交模式,开启事务。commit():提交事务。rollback():回滚事务。
事务控制的注意事项
- 异常处理:事务中任何操作失败都应触发回滚,确保数据一致性。
- 数据库支持:确保数据库引擎支持事务(如 InnoDB)。
- 性能影响:长时间的事务可能锁定资源,影响并发性能。
通过以上方法,可以在 PHP 中高效实现数据库事务控制。







