首页  >  问答  >  正文

java - get_lock(str,timeout)函数使用。

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

怪我咯怪我咯2764 天前421

全部回复(1)我来回复

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:45:21

    这个锁是应用程序级别的,在不同的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)。总之,拿不拿锁是应用程序来决定的,数据库只是提供这个机制。看大家是否抢同一把锁,也是纯粹看第一个参数锁名字这个字符串一样不一样,所以最佳实践是在锁名字前面加上表名和数据库名,以免误伤#🎜🎜#

    回复
    0
  • 取消回复