2026-05-28 21:22:33
PHP通过PDO或mysqli扩展实现数据库事务,确保操作的原子性与数据一致性。核心流程包括开启事务、执行操作、提交或回滚,关键在于保证一系列操作要么全部成功,要么全部撤销。
使用预处理语句(Prepared Statements)分离SQL结构与参数,提前检查语法。
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");$stmt->execute(['John Doe', 'john.doe@example.com']);捕获PDOException,检查错误代码(如23000为唯一约束冲突)。
根据业务逻辑选择回滚或修正数据后重试。
实现重试机制,设置最大重试次数和间隔。
$maxRetries = 3;$retryDelay = 1000; // 毫秒for ($i = 0; $i < $maxRetries; $i++) { try { // 尝试执行事务 break; } catch (Exception $e) { if ($i === $maxRetries - 1) throw $e; usleep($retryDelay * 1000); }}缩短事务执行时间,减少锁持有时间。
优化索引和查询,减少锁竞争范围。
捕获死锁异常(错误代码40001),回滚后重试。
MySQL的InnoDB不支持真正嵌套事务,但可通过保存点(Savepoints)模拟局部回滚:
1. 设置保存点$pdo->exec("SAVEPOINT point1");2. 回滚到保存点$pdo->exec("ROLLBACK TO SAVEPOINT point1");3. 完整示例try { $pdo = new PDO("mysql:host=localhost;dbname=testdb", "username", "password"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->beginTransaction(); // 操作1 $pdo->exec("INSERT INTO table1 (column1) VALUES ('value1')"); // 设置保存点 $pdo->exec("SAVEPOINT point1"); try { // 操作2(可能失败) $pdo->exec("INSERT INTO table2 (column2) VALUES ('value2')"); } catch (Exception $e) { // 局部回滚 $pdo->exec("ROLLBACK TO SAVEPOINT point1"); echo "操作2失败,已回滚到point1: " . $e->getMessage(); } $pdo->commit(); echo "事务已成功提交!";} catch (Exception $e) { $pdo->rollBack(); echo "事务失败: " . $e->getMessage();}隔离级别定义了并发事务间的可见性规则,需根据业务需求选择:
1. 读未提交(Read Uncommitted)通过合理使用事务,可确保PHP应用的数据库操作安全、一致且高效。