当前位置:首页 > PHP

php 实现乐观锁实现

2026-02-15 02:59:28PHP

乐观锁的实现原理

乐观锁基于数据版本(Version)或时间戳(Timestamp)机制实现。在数据读取时不加锁,更新时检查数据是否被其他事务修改。若未被修改,则更新成功;否则根据业务逻辑选择重试或放弃。

基于数据版本的实现

通过为数据表增加一个版本号字段(如 version),在更新时校验版本号是否变化。

数据库表示例:

CREATE TABLE `product` (
  `id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `stock` int(11) NOT NULL,
  `version` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
);

PHP 代码实现:

// 1. 查询数据时获取当前版本号
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("SELECT id, stock, version FROM product WHERE id = ?");
$stmt->execute([$productId]);
$product = $stmt->fetch(PDO::FETCH_ASSOC);

// 2. 更新数据时校验版本号
$newStock = $product['stock'] - 1;
$stmt = $pdo->prepare(
    "UPDATE product SET stock = ?, version = version + 1 
     WHERE id = ? AND version = ?"
);
$affectedRows = $stmt->execute([$newStock, $productId, $product['version']]);

// 3. 判断是否更新成功
if ($affectedRows > 0) {
    echo "更新成功";
} else {
    echo "数据已被其他事务修改,请重试";
}

基于时间戳的实现

使用 updated_at 字段记录最后修改时间,更新时校验时间戳是否变化。

数据库表示例:

ALTER TABLE `product` ADD COLUMN `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

PHP 代码实现:

// 1. 查询数据时获取当前时间戳
$stmt = $pdo->prepare("SELECT id, stock, updated_at FROM product WHERE id = ?");
$stmt->execute([$productId]);
$product = $stmt->fetch(PDO::FETCH_ASSOC);

// 2. 更新数据时校验时间戳
$newStock = $product['stock'] - 1;
$stmt = $pdo->prepare(
    "UPDATE product SET stock = ?, updated_at = NOW() 
     WHERE id = ? AND updated_at = ?"
);
$affectedRows = $stmt->execute([$newStock, $productId, $product['updated_at']]);

// 3. 处理更新结果(同上)

乐观锁的适用场景

  • 读多写少的场景,冲突概率低。
  • 业务逻辑允许重试或失败(如库存扣减、抢购系统)。

注意事项:

  • 需配合事务使用,确保查询和更新的原子性。
  • 高并发场景可能需引入重试机制或队列降级。

php 实现乐观锁实现

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

相关文章

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现递归

php实现递归

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

php实现图片上传

php实现图片上传

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

php实现socket

php实现socket

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

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。…