当前位置:首页 > PHP

php乐观锁实现

2026-02-15 18:02:30PHP

乐观锁的实现原理

乐观锁是一种并发控制机制,假设多用户并发操作时不会冲突,只在提交时检测数据是否被修改。通常通过版本号(version)或时间戳(timestamp)实现。

基于版本号的实现

  1. 数据表设计
    在表中添加一个version字段,类型为整型或时间戳:

    ALTER TABLE `products` ADD COLUMN `version` INT DEFAULT 0;
  2. 更新时检查版本
    执行更新操作时,在WHERE条件中加入版本检查,并递增版本号:

    $pdo->beginTransaction();
    $productId = 1;
    $currentVersion = $pdo->query("SELECT version FROM products WHERE id = $productId")->fetchColumn();
    
    // 业务逻辑处理...
    
    $stmt = $pdo->prepare("UPDATE products SET stock = stock - 1, version = version + 1 
                           WHERE id = ? AND version = ?");
    $affectedRows = $stmt->execute([$productId, $currentVersion]);
    
    if ($affectedRows === 0) {
        $pdo->rollBack();
        throw new Exception("并发修改冲突");
    }
    $pdo->commit();

基于时间戳的实现

  1. 数据表设计
    使用updated_at字段记录最后修改时间:

    ALTER TABLE `orders` ADD COLUMN `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
  2. 更新时比对时间戳
    在更新时验证时间戳是否变化:

    $lastUpdated = $pdo->query("SELECT updated_at FROM orders WHERE id = 123")->fetchColumn();
    
    // 处理业务逻辑...
    
    $result = $pdo->exec("UPDATE orders SET status = 'paid' 
                          WHERE id = 123 AND updated_at = '$lastUpdated'");
    
    if ($result === 0) {
        throw new Exception("数据已被其他进程修改");
    }

使用CAS(Compare-And-Swap)操作

适用于Redis等内存数据库,通过原子性命令实现:

php乐观锁实现

$redis = new Redis();
$redis->connect('127.0.0.1');
$key = 'product:1001';
$currentValue = $redis->get($key);

// 业务计算...
$newValue = $currentValue - 1;

// 仅当值未变化时更新
$success = $redis->watch($key);
if ($success) {
    $redis->multi()
          ->set($key, $newValue)
          ->exec();
}

注意事项

  • 乐观锁适用于冲突频率低的场景,高频冲突建议改用悲观锁
  • 需配合事务使用确保原子性
  • 前端可配合显示版本号,避免提交过期数据

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

相关文章

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php 路由实现

php 路由实现

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

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…

php 实现路由

php 实现路由

PHP 实现路由的方法 在 PHP 中实现路由功能可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 PHP 实现简单路由 通过解析 URL 并匹配对应的处理逻辑,可以实现基本的路由功能。以…

php实现异步图片上传

php实现异步图片上传

异步图片上传的实现方法 在PHP中实现异步图片上传通常需要结合前端JavaScript和后端PHP代码。以下是几种常见的方法: 使用XMLHttpRequest或Fetch API 前端使用Java…