php 实现事务
事务的基本概念
事务是数据库操作中的一个重要机制,用于确保一组操作要么全部成功执行,要么全部不执行。事务具有ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
使用PDO实现事务
PDO(PHP Data Objects)是PHP中用于数据库访问的轻量级接口,支持事务操作。以下是一个使用PDO实现事务的示例:

<?php
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->bindParam(':amount', $amount);
$stmt1->bindParam(':id', $fromId);
$stmt1->execute();
$stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance + :amount WHERE id = :id");
$stmt2->bindParam(':amount', $amount);
$stmt2->bindParam(':id', $toId);
$stmt2->execute();
$pdo->commit();
echo "Transaction completed successfully";
} catch (Exception $e) {
$pdo->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
?>
使用MySQLi实现事务
MySQLi是PHP中另一个常用的数据库扩展,也支持事务操作。以下是使用MySQLi实现事务的示例:

<?php
$mysqli = new mysqli("localhost", "username", "password", "test");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$mysqli->autocommit(FALSE);
try {
$amount = 100;
$fromId = 1;
$toId = 2;
$mysqli->query("UPDATE accounts SET balance = balance - $amount WHERE id = $fromId");
$mysqli->query("UPDATE accounts SET balance = balance + $amount WHERE id = $toId");
$mysqli->commit();
echo "Transaction completed successfully";
} catch (Exception $e) {
$mysqli->rollback();
echo "Transaction failed: " . $e->getMessage();
}
$mysqli->close();
?>
事务的注意事项
确保在事务中使用异常处理机制,以便在发生错误时能够回滚事务。避免在事务中执行长时间运行的操作,以减少锁定资源的时间。
嵌套事务的处理
PHP的PDO和MySQLi本身不支持真正的嵌套事务,但可以通过保存点(SAVEPOINT)模拟嵌套事务的行为。以下是使用PDO实现保存点的示例:
<?php
try {
$pdo->beginTransaction();
$pdo->exec("SAVEPOINT point1");
// 执行一些操作
$pdo->exec("RELEASE SAVEPOINT point1");
$pdo->commit();
} catch (Exception $e) {
$pdo->exec("ROLLBACK TO SAVEPOINT point1");
$pdo->rollBack();
}
?>






