Mysql next-locking 间隙锁(转)
2015-11-08 22:02
507 查看
原文地址:http://blog.itpub.net/22418990/viewspace-753572/
mysql innodb间隙锁就是不仅仅锁住所需要的行(如果锁住的这行不存在)还会锁住一个范围的行,这个范围依据锁住的这行而定。上下刚好是两个相邻索引叶节点的范围。包含下范围,不包含上范围。
eg:
t表的x列有索引,
session 1:
mysql> select x,a from t where x>200 for update;
+-------+------+
| x | a |
+-------+------+
| 202 | NULL |
| 202 | NULL |
| 300 | NULL |
| 300 | NULL |
| 500 | NULL |
| 3040 | NULL |
| 3040 | NULL |
| 30401 | NULL |
+-------+------+
8 rows in set (0.00 sec)
mysql> update t set a=600 where x=501;
Query OK, 1 row affected (8.55 sec)
Rows matched: 1 Changed: 1 Warnings: 0
这样就会锁住 [500,3040) 测试中501下界是500,上界是3039
此时插入x值[500,3030)范围时,会等待
session 2:
mysql> insert into t(x) values(500);
等待
mysql> insert into t(x) values(400);
Query OK, 1 row affected (0.00 sec) 400不在这个范围中间,可以插入
mysql> insert into t(x) values(600);
等待
mysql> insert into t(x) values(3040);
Query OK, 1 row affected (0.00 sec) 3040不在这个范围
间隙锁是否起作用,还有一个参数
innodb_locks_unsafe_for_binlog 起作用。
默认是关闭的,即间隙锁是起作用的,
设置为1 ,间隙锁不起作用,但是开启这个参数会对binlog的记录顺序产生一定影响,从而在复制和恢复时,就会导致数据不一致,这点需要注意。
这个参数不能动态修改,只能在参数文件中设置,然后重启mysql服务生效。
mysql innodb间隙锁就是不仅仅锁住所需要的行(如果锁住的这行不存在)还会锁住一个范围的行,这个范围依据锁住的这行而定。上下刚好是两个相邻索引叶节点的范围。包含下范围,不包含上范围。
eg:
t表的x列有索引,
session 1:
mysql> select x,a from t where x>200 for update;
+-------+------+
| x | a |
+-------+------+
| 202 | NULL |
| 202 | NULL |
| 300 | NULL |
| 300 | NULL |
| 500 | NULL |
| 3040 | NULL |
| 3040 | NULL |
| 30401 | NULL |
+-------+------+
8 rows in set (0.00 sec)
mysql> update t set a=600 where x=501;
Query OK, 1 row affected (8.55 sec)
Rows matched: 1 Changed: 1 Warnings: 0
这样就会锁住 [500,3040) 测试中501下界是500,上界是3039
此时插入x值[500,3030)范围时,会等待
session 2:
mysql> insert into t(x) values(500);
等待
mysql> insert into t(x) values(400);
Query OK, 1 row affected (0.00 sec) 400不在这个范围中间,可以插入
mysql> insert into t(x) values(600);
等待
mysql> insert into t(x) values(3040);
Query OK, 1 row affected (0.00 sec) 3040不在这个范围
间隙锁是否起作用,还有一个参数
innodb_locks_unsafe_for_binlog 起作用。
默认是关闭的,即间隙锁是起作用的,
设置为1 ,间隙锁不起作用,但是开启这个参数会对binlog的记录顺序产生一定影响,从而在复制和恢复时,就会导致数据不一致,这点需要注意。
这个参数不能动态修改,只能在参数文件中设置,然后重启mysql服务生效。
相关文章推荐
- Excel数据插入Mysql数据库可能遇到的问题
- mysql 必知必会 笔记
- MySQL学习笔记(7)之字符集和校对规则
- MySQL存储引擎
- MySQL学习笔记(16)之存储过程
- MySQL学习笔记(15)之索引
- MySQL学习笔记(14)之事务
- MySQL学习笔记(13)之储存引擎
- MySQL学习笔记(12)之触发器(trigger)
- MySQL学习笔记(11)之视图(view)
- MySQL学习笔记(10)之select查询语句
- MySQL学习笔记(9)之外键约束
- MySQL学习笔记(8)之实体间的联系
- MySQL学习笔记(6)之设计范式
- MySQL学习(索引、引擎、优化)
- 在Win7 64位上安装mySQL5.1和Navicat10.0
- mysql的主从,主主,半同步
- MySQL学习笔记(5)之数据定义类型
- MySQL学习笔记(4)之数据操作
- MySQL学习笔记(3)之表操作