当前位置:首页 > PHP

php 实现乐观锁实现

2026-01-30 05:07:40PHP

乐观锁的概念

乐观锁是一种并发控制机制,假设多用户并发操作时不会产生冲突,因此不加锁。只在数据提交时检查数据是否被其他事务修改过。通常通过版本号(Version)或时间戳(Timestamp)实现。

php 实现乐观锁实现

实现乐观锁的核心步骤

数据库表设计
在表中添加一个版本号字段(如version),每次更新数据时版本号递增。

php 实现乐观锁实现

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    stock INT,
    version INT DEFAULT 0
);

更新数据的逻辑

  1. 读取数据时获取当前版本号。
  2. 更新时检查版本号是否与读取时一致,若一致则更新并递增版本号。
// 假设从数据库获取的数据
$productId = 1;
$currentVersion = 5; // 读取时的版本号
$newStock = 10;

// 更新语句,通过版本号校验
$sql = "UPDATE products SET stock = :stock, version = version + 1 
        WHERE id = :id AND version = :version";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':stock', $newStock);
$stmt->bindParam(':id', $productId);
$stmt->bindParam(':version', $currentVersion);
$affectedRows = $stmt->execute();

if ($affectedRows === 0) {
    // 更新失败,版本号已变更或数据不存在
    throw new Exception("并发冲突,数据已被修改");
}

使用时间戳实现乐观锁

若不想用版本号,可用last_updated字段记录时间戳。

ALTER TABLE products ADD COLUMN last_updated TIMESTAMP;
$lastUpdated = '2023-10-01 12:00:00'; // 读取时的时间戳
$sql = "UPDATE products SET stock = :stock, last_updated = NOW() 
        WHERE id = :id AND last_updated = :lastUpdated";
// 其他逻辑与版本号类似

乐观锁的适用场景

  • 读多写少的场景,冲突概率低。
  • 需要高并发性能,避免悲观锁的开销。

注意事项

  • 冲突时需重试或提示用户重新操作。
  • 长时间操作可能因版本号失效导致重试次数增多。

通过版本号或时间戳的比对,可以简单高效地实现乐观锁机制。

标签: 乐观php
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

文件上传的基本实现 在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。 创…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…