当前位置:首页 > PHP

php实现乐观锁

2026-02-15 12:13:54PHP

乐观锁的基本概念

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

实现方法

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

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字段替代版本号:

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实现分布式乐观锁:

php实现乐观锁

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

php实现上传

php实现上传

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

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php实现https

php实现https

PHP 实现 HTTPS 请求 在 PHP 中实现 HTTPS 请求,可以通过多种方式完成,包括使用内置函数、cURL 扩展或第三方库。以下是几种常见的方法: 使用 file_get_content…