php实现事务控制
PHP 实现事务控制的方法
在 PHP 中,事务控制通常通过数据库扩展(如 PDO 或 MySQLi)实现。以下是两种常见的方法:
使用 PDO 实现事务
PDO(PHP Data Objects)提供了一种统一的方式处理数据库事务。以下是实现步骤:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$pdo->beginTransaction();
try {
$stmt1 = $pdo->prepare("UPDATE accounts SET balance = balance - :amount WHERE id = :id");
$stmt1->execute([':amount' => 100, ':id' => 1]);
$stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance + :amount WHERE id = :id");
$stmt2->execute([':amount' => 100, ':id' => 2]);
$pdo->commit();
echo "Transaction completed successfully";
} catch (Exception $e) {
$pdo->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
使用 MySQLi 实现事务
MySQLi 扩展也支持事务控制,适用于 MySQL 数据库:

$mysqli = new mysqli('localhost', 'username', 'password', 'test');
$mysqli->autocommit(FALSE);
try {
$mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$mysqli->commit();
echo "Transaction completed successfully";
} catch (Exception $e) {
$mysqli->rollback();
echo "Transaction failed: " . $e->getMessage();
}
事务控制的注意事项
确保数据库引擎支持事务(如 InnoDB)。MyISAM 引擎不支持事务。
事务应尽量简短,避免长时间占用数据库连接。

在事务中处理异常时,务必调用 rollBack() 或 rollback() 方法。
可以通过 setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) 设置 PDO 错误模式为异常处理。
嵌套事务的处理
某些数据库支持嵌套事务,但 MySQL 不支持真正的嵌套事务。可以通过保存点(SAVEPOINT)模拟:
$pdo->beginTransaction();
$pdo->exec("SAVEPOINT point1");
try {
// 执行一些操作
$pdo->exec("RELEASE SAVEPOINT point1");
} catch (Exception $e) {
$pdo->exec("ROLLBACK TO SAVEPOINT point1");
}






