MYSQL中GET_LOCK的使用

GET_LOCK(str,timeout)
在timeout 秒内尝试获取一个名字为str的锁, 若成功得到锁返回 1,若操作超时还未得到则返回0 (例如,另一个连接获取到了这个锁未释放),若发生错误则返回NULL (诸如缺乏内存或线程mysqladmin kill 被断开 )。
假如你使用GET_LOCK()得到一个锁,当你执行RELEASE_LOCK()时,或你的连接断开(正常或非正常)时,或者持有锁的连接获取了其他锁时,这个锁才会解除。

RELEASE_LOCK(str)
释放锁str;只有获取到锁str的连接才能解锁成功。获取了锁之后,用完记得释放,不然别的sql语句获取这个锁就会失败,解锁成功返回1,失败返回0,该锁不存在则返回NULL。

IS_FREE_LOCK(str)
检查锁str是否可用,返回结果为0,说明指定名称的锁正在被使用。返回1则说明这个锁尚未被使用。

IS_USED_LOCK(str) 检查锁str是否正在被使用,返回结果为持有锁的连接的连接ID,表示给定名称的锁正在被该连接使用,若锁没有被使用返回null。

同一个连接中顺序执行以下语句:

SELECT IS_FREE_LOCK('lock1');

在这里插入图片描述
返回结果为1说明锁lock1尚未被使用

SELECT IS_USED_LOCK('lock1');

在这里插入图片描述
返回结果为NULL说明锁lock1尚未被使用

SELECT GET_LOCK('lock1',10);

在这里插入图片描述
返回结果为1说明该链接获取锁lock1成功

SELECT IS_FREE_LOCK('lock1');

在这里插入图片描述

返回结果为0说明锁lock1正在被使用

SELECT IS_USED_LOCK('lock1');

在这里插入图片描述
返回11说明锁正在被连接ID为11的连接使用

SELECT GET_LOCK('lock1',10);

在这里插入图片描述
返回1说明同一个连接中锁lock1不进行释放但获取锁lock1依然会成功。

SELECT GET_LOCK('lock2',10);

在这里插入图片描述
获取锁lock2成功

SELECT IS_FREE_LOCK('lock1');

在这里插入图片描述
此时再检查锁lock1是否空闲,获取到值1,说明一个连接只能持有一个GET_LOCK获得的锁,再获取第二个锁时第一个锁就会自动释放

SELECT RELEASE_LOCK('lock1');

此时释放锁lock1,返回NULL,说明锁lock1不存在。
在这里插入图片描述

SELECT RELEASE_LOCK('lock2');

在这里插入图片描述
返回1说明锁lock2释放成功

下面建立两个连接执行以下语句:
连接一中执行

SELECT GET_LOCK('lock',10);

在这里插入图片描述
此时返回1说明连接1获取锁lock成功
然后在连接二中执行相同语句

SELECT GET_LOCK('lock',10);

在这里插入图片描述在这里插入图片描述
此时在十秒后返回0说明连接2获取锁lock失败。
连接二中对lock锁进行解锁

SELECT RELEASE_LOCK('lock');

在这里插入图片描述
返回0说明解锁失败,因为锁是在连接一中创建的。
这时我们先在连接二中再次获取锁。

SELECT GET_LOCK('lock',10);

此时连接二会阻塞十秒,连接二阻塞时我们在连接一中释放锁

SELECT RELEASE_LOCK('lock');

在这里插入图片描述
此时返回1,说明连接一解锁成功,连接一解锁成功后,此时连接二就马上解除了阻塞状态
在这里插入图片描述在这里插入图片描述
可以看到连接二在阻塞2.459秒后获取到了锁lock。
最后,我们验证完了我们的测试,不要忘记在连接二中进行解锁

SELECT RELEASE_LOCK('lock');
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值