mysql中的get_lock锁机制解析
mysql中的get_lock锁机制解析
GET_LOCK(key,timeout) 需要两个连接会话
RELEASE_LOCK(key) 锁是否释放,释放了返回1
IS_FREE_LOCK(key) 返回当前连接ID,表示名称为'xxxx'的锁正在被使用。
key 锁的名字,timeout加锁等待时间,时间内未加锁成功则事件回滚。get_lock 加锁成功返回1,
这个锁是应用程序级别的,在不同的mysql会话之间使用,是名字锁,不是锁具体某个表名或字段,具体是锁什么完全交给应用程序。它是一种独占锁,意味着哪个会话持有这个锁,其他会话尝试拿这个锁的时候都会失败。
session A select get_lock('test',1);
session B select get_lock('test',5);
可以指定表也可以不指定
直到关闭连接会话结束,锁才会释放,但不像redis那样加了锁只要不主动释放就一直有。
但是当会话1 get_lock 后,未释放。会话2 不get_lock 同一个key,或者就不get_lock,依然可以对数据进行任何操作,所以加锁只是说人为的主观的想要让某些操作同时只有一个连接能进行操作,别的连接不调用get_lock加同一个锁,那它不会受到任何影响,想干什么干什么。
session1
session2
get_lock:但是当会话1 get_lock 后,未释放。会话2 不get_lock 同一个key,或者就不get_lock,依然可以对数据进行任何操作,所以加锁只是说人为的主观的想要让某些操作同时只有一个连接能进行操作,别的连接不调用get_lock加同一个锁,那它不会受到任何影响,想干什么干什么。
session1
session2
优缺点分析 (1)这种方式对于更新所有列比较有效,但是得把查询的语句也放在锁内执行; (2)这种方式当客户端无故断线了会自动释放锁,比较好,不像redis锁那样,如果加完锁断了,那么锁一直在; (3)这种方式是针对锁内的所有操作加锁,并不针对特定表或特定行,所以使用了同一个Key的锁但不同的操作都会共用一把锁,会导致效率低下; (4)如果查询语句放在锁之前,则数据可能是旧的,更新之后会把查询之后更新之前别的客户端更新的数据覆盖掉;
相关文章
- mycat 链接mysql提示ERROR 3009 (HY000): java.lang.IllegalArgumentExceptio解决方式
- 关于MySQL字符集问题:Specified key was too long; max key length is 767 bytes
- Mysql授权允许远程访问解决Navicat for MySQL连接mysql提示客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端
- 要想深入理解mysql索引?这16个点你必须要了解!
- mysql-介绍、MySQL部署、数据类型、存储引擎
- 【MySQL】Can't get stat of './mysql/slow_log.CSV' (Errcode: 2)
- 【MySql】mysql 的权限体系介绍
- 【Mysql】xtrabackup 备份和恢复测试
- 【异常】ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock
- XtraBackup出现 Can't connect to local MySQL server through socket '/tmp/mysql.sock'
- MySQL账户安全设置
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
- Mysql时间存储类型优缺点?DATETIME?TIMESTAMP?INT?
- 01 MySQL锁概述
- MYSQL随机抽取查询 MySQL Order By Rand()效率问题
- [root@master mysql]# mysql -uroot -pjsb ERROR 2002 (HY000): Can't connect to local MySQL server thro
- Mysql一个非常有用的内置函数今天碰到要把MySQL数据库中的varchar转换成date类型进
- mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql/data/mysql.pid) 的解决方法
- MySQL运维---慢日志与备份
- MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)
- Mysql 如果有多个可选条件怎么加索引_MySQL|mysql-索引
- Linux重置Mysql密码_解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost
- [转]2006 MySQL server has gone away错误,最大值溢出解决办法 mysql max_allowed_packet 查询和修改
- paip.navicat form mysql导入文本文件时CPU占用100%的解决
- mysql主从demo配置
- 【高可用MySQL解决方案】centos7配置mysql主从复制
- 〖Python 数据库开发实战 - MySQL篇㉔〗- 数据插入操作 - INSERT语句
- 实战解析丨如何对Mysql连接请求的tcpdump内容进行分析
- Python:mysql-replication监控MySQL的binlog变动
- 详解MySQL information_schema数据库常用的表信息以及各表对应的字段信息;以及如何登录mysql和创建视图
- mysql 查看 脏页_MySQL:刷脏页
- Mysql新增字段到大数据表导致锁表
- Mysql报错:Can't connect to local MySQL server through socket '/tmp/mysql.sock'