get_lock(str,timeout)函数使用。

发布于 2022-09-03 09:45:09 字数 234 浏览 17 评论 0

在DB层面实现分布式锁的方法有:利用MySQL的内置函数 get_lock(key, timeout)来实现,这个函数的约定在指定时间内持有锁,它锁的是一行中的某一个字段么?还是锁的是一行?具体项目中是如何使用的?查了一些资料,大概是先约定同一个key,然后先执行get_lock(key,timeout)的,会持有锁,其他的sql只能等待;除非当前的线程释放锁release(key),但是它是如何在项目中控制锁的粒度呢?最好有实例能详解一下。谢谢~~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

神回复 2022-09-10 09:45:09

这个锁是应用程序级别的,在不同的mysql会话之间使用。它只是个名字锁,跟你理解的表啊行啊字段啊都没有直接关系,具体是锁什么完全交给应用程序。它是一种独占锁,意味着哪个会话持有这个锁,其他会话尝试拿这个锁的时候都会失败。

比如你想锁一行记录record A,那么当前会话里你建一个锁get_lock("record A", 10)。此时其他所有会话依然可以随便访问和修改record A,除非他们显式的也调用get_lock("record A", 10)

也就是说完全是你的应用程序来决定检不检查锁。你如果想锁,就让所有会话在访问record A的时候都显式的调用get_lock("record A", 10),那明显只有一个会话能成功。其他会话只有等超时或者持有锁的会话调用release_lock后才能重新拿到锁

同理,你想锁一个字段column A,那跟上面一样建一个锁get_lock("column A", 10)。总之,拿不拿锁是应用程序来决定的,数据库只是提供这个机制。看大家是否抢同一把锁,也是纯粹看第一个参数锁名字这个字符串一样不一样,所以最佳实践是在锁名字前面加上表名和数据库名,以免误伤

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文