java - get_lock(str,timeout)函数使用。
怪我咯
怪我咯 2017-04-18 09:43:21
0
1
417

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

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(1)
伊谢尔伦

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

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

也就是说完全是你的应用程序来决定检不检查锁。你如果想锁,就让所有会话在访问record A的时候都显式的调用get_lock("record A", 10),那明显只有一个会话能成功。其他会话只有等超时或者持有锁的会话调用release_lock后才能重新拿到锁#🎜🎜# #🎜🎜#同理,你想锁一个字段column A,那跟上面一样建一个锁get_lock("column A", 10)。总之,拿不拿锁是应用程序来决定的,数据库只是提供这个机制。看大家是否抢同一把锁,也是纯粹看第一个参数锁名字这个字符串一样不一样,所以最佳实践是在锁名字前面加上表名和数据库名,以免误伤#🎜🎜#
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!