在 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
語句隱式地獲取意向鎖。注意:在實際應用中,應根據具體場景和需求選擇合適的鎖機制。悲觀鎖可能會導致性能下降,因為其他事務需要等待鎖釋放。而樂觀鎖可能會導致事務重試,因為數據在事務過程中可能被其他事務修改。