**樂觀鎖:**
樂觀鎖的基本思想是,當多個用戶同時訪問共享資源時,不會立即鎖定資源,而是在提交更新之前檢查是否有沖突。如果沒有沖突,更新將繼續進行;如果發現沖突,更新將被拒絕。
在樂觀鎖中,通常使用版本號或時間戳等字段來標識資源的版本。每次更新操作都會增加版本號或更新時間戳。如果在提交更新時發現版本號或時間戳不匹配,說明有沖突發生。
樂觀鎖的優點是它不會阻塞其他用戶的訪問,只有在沖突發生時才會拒絕更新操作。這可以提高并發性能。
以下是一個使用樂觀鎖的示例:
```
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// 獲取記錄
$id = 1;
$stmt = $db->prepare("SELECT id, data, version FROM items WHERE id = :id");
$stmt->execute(array(':id' => $id));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// 假設獲取到的記錄不為空
if ($row) {
// 更新數據
$data = "new data";
$version = $row['version'] + 1; // 預期的新版本號
// 更新記錄
$stmt = $db->prepare("UPDATE items SET data = :data, version = :version WHERE id = :id AND version = :current_version");
$stmt->execute(array(
':data' => $data,
':version' => $version,
':id' => $id,
':current_version' => $row['version']
));
// 檢查更新是否成功
if ($stmt->rowCount() > 0) {
echo "Record updated successfully";
} else {
echo "Concurrent update, try again";
}
}
```