当前位置:首页 > PHP

php实现乐观锁

2026-02-15 12:13:54PHP

乐观锁的基本概念

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

实现方法

基于版本号的乐观锁
在数据表中添加一个version字段,每次更新时检查版本号是否匹配:

php实现乐观锁

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

PHP代码示例
通过版本号实现更新冲突检测:

// 假设从数据库获取原始数据
$productId = 1;
$originalVersion = 5;
$newStock = 100;

$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare(
    "UPDATE products SET stock = :stock, version = version + 1 
     WHERE id = :id AND version = :version"
);
$stmt->bindParam(':stock', $newStock);
$stmt->bindParam(':id', $productId);
$stmt->bindParam(':version', $originalVersion);
$affectedRows = $stmt->execute();

if ($affectedRows === 0) {
    throw new Exception('更新失败,数据已被其他操作修改');
}

基于时间戳的乐观锁

使用updated_at字段替代版本号:

php实现乐观锁

ALTER TABLE products ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

PHP代码示例

$productId = 1;
$originalTimestamp = '2023-01-01 12:00:00';

$stmt = $pdo->prepare(
    "UPDATE products SET stock = :stock 
     WHERE id = :id AND updated_at = :timestamp"
);
$stmt->bindParam(':stock', $newStock);
$stmt->bindParam(':id', $productId);
$stmt->bindParam(':timestamp', $originalTimestamp);

注意事项

  • 需要确保版本号或时间戳的查询和更新是原子操作
  • 高并发场景下可能产生大量失败操作,需配合重试机制
  • 不适合强一致性要求的场景(如金融系统)

扩展方案

结合Redis实现分布式乐观锁:

$redis = new Redis();
$redis->connect('127.0.0.1');
$lockKey = "product_lock_{$productId}";

// 设置NX锁(仅当key不存在时生效)
$locked = $redis->set($lockKey, 1, ['NX', 'EX' => 10]);
if (!$locked) {
    throw new Exception('系统繁忙,请重试');
}

try {
    // 执行数据库操作
} finally {
    $redis->del($lockKey);
}

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

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现队列

php实现队列

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

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…

php搜索功能实现

php搜索功能实现

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