get_lock(str,timeout)函数使用。
在DB层面实现分布式锁的方法有:利用MySQL的内置函数 get_lock(key, timeout)来实现,这个函数的约定在指定时间内持有锁,它锁的是一行中的某一个字段么?还是锁的是一行?具体项目中是如何使用的?查了一些资料,大概是先约定同一个key,然后先执行get_lock(key,timeout)的,会持有锁,其他的sql只能等待;除非当前的线程释放锁release(key),但是它是如何在项目中控制锁的粒度呢?最好有实例能详解一下。谢谢~~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这个锁是应用程序级别的,在不同的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)
。总之,拿不拿锁是应用程序来决定的,数据库只是提供这个机制。看大家是否抢同一把锁,也是纯粹看第一个参数锁名字这个字符串一样不一样,所以最佳实践是在锁名字前面加上表名和数据库名,以免误伤