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("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt1->execute(["John Doe", "john@example.com"]);
$stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE user_id = ?");
$stmt2->execute([100, 1]);
$pdo->commit();
echo "Transaction completed successfully.";
} catch (PDOException $e) {
$pdo->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
使用 MySQLi 实现事务
MySQLi 是 PHP 的 MySQL 扩展,也支持事务操作。以下是一个使用 MySQLi 实现事务的示例:

$mysqli = new mysqli("localhost", "username", "password", "test");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$mysqli->autocommit(FALSE);
$query1 = "INSERT INTO users (name, email) VALUES ('Jane Doe', 'jane@example.com')";
$query2 = "UPDATE accounts SET balance = balance + 100 WHERE user_id = 2";
if ($mysqli->query($query1) && $mysqli->query($query2)) {
$mysqli->commit();
echo "Transaction completed successfully.";
} else {
$mysqli->rollback();
echo "Transaction failed: " . $mysqli->error;
}
$mysqli->close();
使用 Laravel 的数据库事务
Laravel 提供了简洁的数据库事务 API。以下是 Laravel 中实现事务的示例:
use Illuminate\Support\Facades\DB;
try {
DB::transaction(function () {
DB::table('users')->insert([
'name' => 'Alice',
'email' => 'alice@example.com'
]);
DB::table('accounts')->where('user_id', 3)->increment('balance', 50);
});
echo "Transaction completed successfully.";
} catch (\Exception $e) {
echo "Transaction failed: " . $e->getMessage();
}
手动控制事务
在某些情况下,可能需要手动控制事务的提交和回滚。以下是手动控制事务的示例:
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$pdo->beginTransaction();
$pdo->exec("INSERT INTO orders (product_id, quantity) VALUES (1, 2)");
$pdo->exec("UPDATE inventory SET quantity = quantity - 2 WHERE product_id = 1");
if (/* 检查库存是否充足 */) {
$pdo->commit();
echo "Order placed successfully.";
} else {
$pdo->rollBack();
echo "Insufficient inventory.";
}
} catch (PDOException $e) {
$pdo->rollBack();
echo "Error: " . $e->getMessage();
}
注意事项
- 确保数据库引擎支持事务(如 InnoDB)。
- 在事务中避免长时间运行的操作,以减少锁竞争。
- 捕获异常并在异常发生时回滚事务。
- 测试事务的回滚逻辑,确保数据一致性。






