php实现事务控制
事务控制的基本概念
事务是数据库操作中的一个重要概念,用于确保一组操作要么全部成功执行,要么全部不执行。在PHP中,事务控制通常通过PDO或MySQLi扩展实现。
使用PDO实现事务控制
PDO(PHP Data Objects)提供了一个统一的接口来访问数据库,支持事务控制。
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->beginTransaction();
$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 (PDOException $e) {
$pdo->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
使用MySQLi实现事务控制
MySQLi是PHP的MySQL扩展,也支持事务控制。
$mysqli = new mysqli("localhost", "username", "password", "test");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$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();
}
$mysqli->close();
事务的隔离级别
事务的隔离级别决定了事务之间的可见性。常见的隔离级别包括:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
在PDO中设置隔离级别:
$pdo->exec("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
嵌套事务
PHP本身不支持真正的嵌套事务,但可以通过保存点模拟。
$pdo->beginTransaction();
$pdo->exec("SAVEPOINT point1");
try {
// 执行一些操作
$pdo->exec("RELEASE SAVEPOINT point1");
} catch (Exception $e) {
$pdo->exec("ROLLBACK TO SAVEPOINT point1");
}
错误处理
事务中的错误处理至关重要。建议使用try-catch块捕获异常,并在发生错误时回滚事务。

try {
// 事务操作
} catch (PDOException $e) {
// 错误处理
}
性能考虑
长时间运行的事务会锁定数据库资源,影响性能。应尽量缩短事务的执行时间,避免在事务中进行耗时操作。






