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 协议》,转载必须注明作者和本文链接