当前位置:首页 > 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 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

php 购物车实现session

php 购物车实现session

PHP 购物车实现(基于 Session) 在 PHP 中,使用 Session 实现购物车功能是一种常见方法。Session 可以跨页面存储用户数据,适合临时保存购物车信息。 初始化 Sessio…