0913关于间隙锁的模拟

Posted 秦楚风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0913关于间隙锁的模拟相关的知识,希望对你有一定的参考价值。

转自http://blog.itpub.net/22418990/viewspace-753572/

mysql  innodb间隙锁就是不仅仅锁住所需要的行(如果锁住的这行不存在)还会锁住一个范围的行,这个范围依据锁住的这行而定。上下刚好是两个相邻索引叶节点的范围。包含下范围,不包含上范围。

设置服务器的隔离级别 tx_isolation=REPEATABLE-READ

CREATE TABLE t
(`x` INT,a INT)

ALTER TABLE t ADD INDEX idx_x(`x`);

-- 制造数据select x,a from t where x>200

+-------+------+
| 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)
 
session 1:
 update t set a=600 where x=501;
这样就会锁住 [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服务生效。

以上是关于0913关于间隙锁的模拟的主要内容,如果未能解决你的问题,请参考以下文章

0913作业(冒泡排序二分查找法模拟摇乐游戏)

如何模拟“锁定”文件(具有写锁的文件)

MySQL 是怎么加行级锁的?为什么一会是 next-key 锁,一会是间隙锁,一会又是记录锁?

MySQL 是怎么加行级锁的?为什么一会是 next-key 锁,一会是间隙锁,一会又是记录锁?

bzoj3325[Scoi2013]密码 逆模拟Manacher

在 iPad 上运行的 iPhone 应用程序中横向视图顶部的 20 像素间隙