zoukankan      html  css  js  c++  java
  • 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服务生效。
  • 相关阅读:
    SPComm的一点小诀窍 spcomm的问题导致数据丢失 0x11与0x13错误
    关于DELPHI数组,指针,字符串转换的例子!(转)
    SQL常用语法大全
    SQL触发器实例讲解
    Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)
    delphi 生成条形码(fastreport 实现)
    delphi 判断字符串有中文
    delphi const
    delphi as
    delphi 字符串常识
  • 原文地址:https://www.cnblogs.com/qcfeng/p/7514392.html
Copyright © 2011-2022 走看看