CREATE TABLE users ( id INTPRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), age INT, version INTDEFAULT0 );
2.2 读取数据
在读取数据时,获取当前的版本号:
SELECT id, name, age, version FROM users WHERE id =1;
2.3 更新数据
在更新数据时,使用 WHERE 子句检查版本号是否与读取时相同。只有当版本号匹配时,更新才会成功:
UPDATE users SET name ='New Name', age =30, version = version +1 WHERE id =1AND version =0;
如果更新的行数为 0,说明版本号不匹配,表示数据已被其他事务修改。
3. 处理更新结果
在执行更新后,检查受影响的行数:
$affectedRows = $db->exec($updateQuery); if ($affectedRows === 0) { // 处理冲突:数据已被其他事务修改 echo"Update failed: data has been modified by another transaction."; } else { echo"Update successful."; }
4. 示例代码
以下是一个完整的 PHP 示例,演示如何使用乐观锁进行更新操作:
<?php // 假设已经建立数据库连接 $db
// 获取当前用户信息 $userId = 1; $stmt = $db->prepare("SELECT id, name, age, version FROM users WHERE id = ?"); $stmt->execute([$userId]); $user = $stmt->fetch(PDO::FETCH_ASSOC);
// 检查用户是否存在 if ($user) { // 假设我们想更新用户的姓名和年龄 $newName = "New Name"; $newAge = 30; $currentVersion = $user['version'];
// 执行更新 $updateStmt = $db->prepare("UPDATE users SET name = ?, age = ?, version = version + 1 WHERE id = ? AND version = ?"); $updateResult = $updateStmt->execute([$newName, $newAge, $userId, $currentVersion]);
if ($updateResult && $updateStmt->rowCount() > 0) { echo"Update successful."; } else { echo"Update failed: data has been modified by another transaction."; } } else { echo"User not found."; } ?>