ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Mysql next-locking 间隙锁

Mysql next-locking 间隙锁

原创 Linux操作系统 作者:longqidong 时间:2013-01-30 15:49:41 0 删除 编辑
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服务生效。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22418990/viewspace-753572/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-08-26

  • 博文量
    94
  • 访问量
    474892