**乐观锁:**
乐观锁的基本思想是,当多个用户同时访问共享资源时,不会立即锁定资源,而是在提交更新之前检查是否有冲突。如果没有冲突,更新将继续进行;如果发现冲突,更新将被拒绝。
在乐观锁中,通常使用版本号或时间戳等字段来标识资源的版本。每次更新操作都会增加版本号或更新时间戳。如果在提交更新时发现版本号或时间戳不匹配,说明有冲突发生。
乐观锁的优点是它不会阻塞其他用户的访问,只有在冲突发生时才会拒绝更新操作。这可以提高并发性能。
以下是一个使用乐观锁的示例:
```
$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";
}
}
```