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

查看:118
本文介绍了java - get_lock(str,timeout)函数使用。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

解决方案

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

这篇关于java - get_lock(str,timeout)函数使用。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆