简单阻塞分布式锁
3

简单 阻塞分布式锁

最近看了很多分布式锁的实现,但是对于简单业务来说,太过于复杂。现在介绍一个简单的、基于 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();
}
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
未填写
文章
0
粉丝
0
喜欢
3
收藏
0
排名:522
访问:218
私信