php 实现事务
PHP 实现事务的方法
在 PHP 中,事务通常用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID 特性)。以下是几种常见的实现方式:

使用 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();
$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 是 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();
事务处理的注意事项
- 确保数据库引擎支持事务(如 InnoDB)
- 在事务中避免长时间运行的操作
- 合理设置事务隔离级别
- 正确处理异常情况,确保失败时回滚
事务隔离级别设置
可以通过以下方式设置事务隔离级别:
// PDO 方式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
// MySQLi 方式
$mysqli->query("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ");
常见的隔离级别包括 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。






