当前位置:首页 > PHP

php 实现乐观锁实现

2026-03-13 01:50:14PHP

乐观锁的基本概念

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

实现方式一:基于版本号

在数据表中增加一个version字段,每次更新时检查版本号是否一致。

-- 表结构示例
CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    stock INT,
    version INT DEFAULT 0
);
// PHP代码示例
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$id = 1;
$newStock = 10;

// 查询当前版本号和库存
$stmt = $pdo->prepare("SELECT stock, version FROM products WHERE id = ?");
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if ($row) {
    $oldStock = $row['stock'];
    $version = $row['version'];

    // 更新时检查版本号
    $stmt = $pdo->prepare("UPDATE products SET stock = ?, version = version + 1 WHERE id = ? AND version = ?");
    $stmt->execute([$newStock, $id, $version]);

    if ($stmt->rowCount() === 0) {
        echo "更新失败,数据已被其他操作修改";
    } else {
        echo "更新成功";
    }
}

实现方式二:基于时间戳

使用last_updated字段记录最后修改时间,更新时比对时间戳。

-- 表结构示例
ALTER TABLE products ADD COLUMN last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
// PHP代码示例
$stmt = $pdo->prepare("SELECT stock, last_updated FROM products WHERE id = ?");
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if ($row) {
    $oldTimestamp = $row['last_updated'];

    // 更新时检查时间戳
    $stmt = $pdo->prepare("UPDATE products SET stock = ? WHERE id = ? AND last_updated = ?");
    $stmt->execute([$newStock, $id, $oldTimestamp]);

    if ($stmt->rowCount() === 0) {
        echo "更新失败,数据已被其他操作修改";
    }
}

实现方式三:基于条件值

直接比对业务字段(如库存数量),适用于简单场景。

php 实现乐观锁实现

// PHP代码示例
$stmt = $pdo->prepare("UPDATE products SET stock = ? WHERE id = ? AND stock = ?");
$stmt->execute([$newStock, $id, $oldStock]);

if ($stmt->rowCount() === 0) {
    echo "更新失败,库存已变化";
}

注意事项

  1. 重试机制:乐观锁失败后通常需要重试,建议结合循环或队列处理。
  2. 性能影响:版本号或时间戳需加索引,避免全表扫描。
  3. 事务隔离:确保操作在事务内执行,避免脏读问题。

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

相关文章

php实现文件上传

php实现文件上传

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

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…