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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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