当前位置:首页 > PHP

php 实现乐观锁实现

2026-03-13 01:50:14PHP

乐观锁的基本概念

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

php 实现乐观锁实现

实现方式一:基于版本号

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

php 实现乐观锁实现

-- 表结构示例
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代码示例
$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实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Sessi…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php实现注册登录

php实现注册登录

PHP 注册功能实现 创建数据库表(以 MySQL 为例) CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…