mysqlmmm工作原理
实验拓扑:192.168.80.181 mariadb主服务器192.168.80.182 mariadb 主服务器192.168.80.185 mmm监视器monitor192.168.80.189...
2024.11.150x01:什么是间隙锁
间隙锁(Gap Lock)是Innodb在可重复读提交下为了解决幻读问题时引入的锁机制。当用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这些“间隙”进行加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。
0x02:间隙锁引起的问题
因为执行select语句中,如果通过范围查找的话,间隙锁会锁定整个范围内所有的索引键值,即使这个键值并不存在。这个就是间隙锁最致命的缺点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定值范围内的任何数据,在某些场景下这可能会针对性造成很大的危害。
0x03:间隙锁例子
建表:
CREATE TABLE `gas_lock_tab` (`id` bigint(20) NOT NULL COMMENT ‘id‘ ,`user_name_py` int(11) NOT NULL COMMENT ‘用户姓名拼音‘ ,PRIMARY KEY (`id`),INDEX `usernameIndex` (`user_name_py`) USING BTREE )ENGINE=InnoDBDEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ciROW_FORMAT=DYNAMIC;插入数据:
insert INTO `gas_lock_tab`(`id`, `user_name_py`) VALUES (1, ‘huangjinjin‘);insert INTO `gas_lock_tab`(`id`, `user_name_py`) VALUES (3, ‘java乐园‘);insert INTO `gas_lock_tab`(`id`, `user_name_py`) VALUES (5, ‘架构师知音‘);insert INTO `gas_lock_tab`(`id`, `user_name_py`) VALUES (8, ‘java狂人‘);插入数据后查询:
mysql> select * from gas_lock_tab;+----+--------------+| id | user_name_py |+----+--------------+| 1 | huangjinjin || 3 | java乐园 || 8 | java狂人 || 5 | 架构师知音 |+----+--------------+4 rows in set注意表中的数据,id字段是int型,包含1,3,5,8;当然1到8中间,缺少连续的id:2,4,6,7,而没有连续下来。一般在表里的主键id最好是连续的,方便索引;所谓的删除其实是做逻辑删除,只是做了状态更改,而不做物理删除。
打开两个Mysql终端,分别设置autocommit为0(手动提交事务),也就是关闭自动提交功能,事务隔离级别处于可重复读状态。
session 1:
mysql> set autocommit=0;Query OK, 0 rows affectedsession 2:
mysql> set autocommit=0;Query OK, 0 rows affectedsession 1 执行update操作,执行成功
mysql> update gas_lock_tab set user_name_py = ‘1234‘ where id > 1 and id实验拓扑:192.168.80.181 mariadb主服务器192.168.80.182 mariadb 主服务器192.168.80.185 mmm监视器monitor192.168.80.189...
2024.11.15有一台预上线的服务器最近在做压力测试,也引发了一系列的相关问题,排查思路可以提供参考。问题的起因就是收到同事提醒,根据监控报警提示,磁盘空间满了。上面有一个MySQL服务,现在已经写入不了数据了。>>...
2024.11.15一、初识报错注入C站老规矩:先说是什么,再说为什么。这是一个测试网站(SQLi Labs靶场的第一关),功能很简单:在地址栏输入用户id,页面返回对应的用户信息。比如,地址栏输入 ?id=1,页面返回...
2024.11.12作者:CHEN川来源:www.jianshu.com/p/d7665192aaaf说起MySQL的查询优化,相信大家积累一堆技巧:不能使用select *、不使用NULL字段、合理创建索引、为字段选择...
2024.11.12只是描述了mvcc解决不可重复读的情况,并没有描述如何解决幻读的。幻读:侧重于insert、delete这种操作,第一次查出生成视图之后,即便有别的事务insert、delete,也不影响后续的查询。...
2024.11.13