当前位置:首页 > PHP

php 实现事务锁

2026-01-30 08:22:54PHP

PHP 实现事务锁的方法

在 PHP 中,事务锁通常用于确保数据库操作的原子性和一致性,避免并发操作导致的数据冲突。以下是几种常见的实现方法:

php 实现事务锁

使用 MySQL 事务与行级锁

通过 MySQL 的 InnoDB 引擎支持的事务和行级锁机制,可以实现事务锁。

php 实现事务锁

$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$pdo->beginTransaction();

try {
    // 锁定某一行数据(FOR UPDATE 表示排他锁)
    $stmt = $pdo->prepare('SELECT * FROM accounts WHERE id = ? FOR UPDATE');
    $stmt->execute([$accountId]);
    $account = $stmt->fetch();

    // 执行更新操作
    $updateStmt = $pdo->prepare('UPDATE accounts SET balance = ? WHERE id = ?');
    $updateStmt->execute([$newBalance, $accountId]);

    // 提交事务
    $pdo->commit();
} catch (Exception $e) {
    // 回滚事务
    $pdo->rollBack();
    throw $e;
}
  • FOR UPDATE:对查询的行加排他锁,其他事务无法修改或加锁。
  • LOCK IN SHARE MODE:共享锁,允许其他事务读取但不能修改。

使用 Redis 分布式锁

在分布式环境中,可以使用 Redis 实现事务锁,避免多服务器并发问题。

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$lockKey = 'account_lock_' . $accountId;
$lockTimeout = 10; // 锁超时时间(秒)

// 尝试加锁(SETNX + EXPIRE)
$locked = $redis->set($lockKey, 1, ['nx', 'ex' => $lockTimeout]);

if ($locked) {
    try {
        // 执行事务操作
        $pdo->beginTransaction();
        // ... 数据库操作
        $pdo->commit();
    } finally {
        // 释放锁
        $redis->del($lockKey);
    }
} else {
    throw new Exception('获取锁失败,请重试');
}
  • set 参数nx 表示仅当键不存在时设置,ex 设置超时时间。
  • 锁释放:必须确保锁最终被释放,避免死锁。

使用文件锁(flock)

对于单机环境,可以通过文件锁实现简单的互斥锁。

$lockFile = '/tmp/account_lock_' . $accountId;
$fp = fopen($lockFile, 'w+');

if (flock($fp, LOCK_EX)) { // 获取排他锁
    try {
        // 执行事务操作
        $pdo->beginTransaction();
        // ... 数据库操作
        $pdo->commit();
    } finally {
        // 释放锁
        flock($fp, LOCK_UN);
        fclose($fp);
    }
} else {
    throw new Exception('获取锁失败');
}
  • LOCK_EX:排他锁,其他进程无法获取锁。
  • LOCK_UN:释放锁。

注意事项

  1. 死锁风险:确保锁最终被释放,避免因异常导致锁未释放。
  2. 锁粒度:尽量缩小锁的范围(如行级锁而非表锁)。
  3. 超时机制:为锁设置超时时间,避免长时间阻塞。
  4. 分布式一致性:在分布式系统中,Redis 或 ZooKeeper 更适用。

根据实际场景选择合适的方法,单机环境可用 MySQL 或文件锁,分布式环境推荐 Redis。

标签: 事务php
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('lo…

php实现树

php实现树

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

php实现递归

php实现递归

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

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php如何实现直播

php如何实现直播

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

php实现上传

php实现上传

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