当前位置:首页 > 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等内存数据库,通过原子性命令实现:

$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实现文件上传

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

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inte…