在 PHP 中,事务处理是一种确保数据库操作原子性、一致性、隔离性和持久性(ACID)的方法。锁机制是事务处理中的一个重要组成部分,它可以确保在事务过程中数据不会被其他事务修改。以下是几种常见的锁机制及其在 PHP 中的实现:
// 假设有一个名为 "users" 的表,其中有一个名为 "version" 的版本号字段
$selectQuery = "SELECT * FROM users WHERE id = ? FOR UPDATE;";
$stmt = $pdo->prepare($selectQuery);
$stmt->execute([$userId]);
$user = $stmt->fetch();
// 检查数据是否已被修改
if ($user['version'] != $expectedVersion) {
// 数据已被修改,放弃当前事务
// ...
} else {
// 更新数据
$updateQuery = "UPDATE users SET name = ?, version = version + 1 WHERE id = ? AND version = ?;";
$stmt = $pdo->prepare($updateQuery);
$stmt->execute([$newName, $userId, $expectedVersion]);
// 提交事务
// ...
}
SELECT ... FOR UPDATE
语句实现悲观锁。// 假设有一个名为 "users" 的表,其中有一个名为 "id" 的字段
$selectQuery = "SELECT * FROM users WHERE id = ? FOR UPDATE;";
$stmt = $pdo->prepare($selectQuery);
$stmt->execute([$userId]);
$user = $stmt->fetch();
// 更新数据
$updateQuery = "UPDATE users SET name = ? WHERE id = ?;";
$stmt = $pdo->prepare($updateQuery);
$stmt->execute([$newName, $userId]);
// 提交事务
// ...
SELECT ... FOR UPDATE
语句隐式地获取意向锁。注意:在实际应用中,应根据具体场景和需求选择合适的锁机制。悲观锁可能会导致性能下降,因为其他事务需要等待锁释放。而乐观锁可能会导致事务重试,因为数据在事务过程中可能被其他事务修改。