PHP 实现简单阻塞分布式锁

简单 阻塞分布式锁

最近看了很多分布式锁的实现,但是对于简单业务来说,太过于复杂。现在介绍一个简单的、基于 mysql 实现的。这种实现方式对于 php-fpm 的来说十分方便,因为不用考虑 进程崩溃后锁的释放问题,进程崩溃后 锁 回自动释放。

具体实现

这里主要是借用 mysql 的 for update 语法。假设有A B 两台服务器连接同一个数据库。
首先 A 服务器进行此操作:

begin;
select * from nlock where id = 1 for update

此时 B 服务器进行此操作

begin
select * from nlock where id = 1 for update

此时, A 服务器 尚未提交事务,则 B 需要等待 A 服务器提交事务后,才可以获得锁。
这样就是一个简单的分布式锁。

这里有个需要注意的地方:当 B 获得锁后,需要对自己所需资源的状态进行重新判断,因为你获得锁以后, 可能 A 对资源状态进行了改变。

Demo:

function getLock($id)
{

    begin();

    try {
        $sql = "select id from `nlock` where id = " . $id . " for update";
        return DB($sql)->execute();
    } catch (Exception $e) {
        rollBack();
        throw $e;
    }
}

function releaseLock()
{
    commit();
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!