【配置的确认与修改】
要测试InnoDB的锁互斥,以及死锁,有几个配置务必要提前确认:
区间锁是否关闭
事务自动提交(auto commit)是否关闭
事务的隔离级别(isolation level)
这几个参数,会影响实验结果。
【事务的隔离级别】辅助材料:
《事务的隔离级别,InnoDB如何实现?》
间隙锁是否关闭
区间锁(间隙锁,临键锁)是InnoDB特有施加在索引记录区间的锁,MySQL5.6可以手动关闭区间锁,它由innodb_locks_unsafe_for_binlog参数控制:
设置为ON,表示关闭区间锁,此时一致性会被破坏(所以是unsafe)
设置为OFF,表示开启区间锁
可以这么查询该参数:
show global variables like "innodb_locks%";
【间隙锁,临键锁】辅助材料:
《InnoDB,索引记录上的三种锁》
事务自动提交
MySQL默认把每一个单独的SQL语句作为一个事务,自动提交。
可以这么查询事务自动提交的参数:
show global variables like "autocommit";
事务的隔离级别
不同事务的隔离级别,InnoDB的锁实现是不一样。
可以这么查询事务的隔离级别:
show global variables like "tx_isolation";
可以这么设置事务的隔离级别:
set session transaction isolation level X;
X取:
read uncommitted
read committed
repeatable read
serializable
图片
这三个参数,MySQL5.6的默认值如上:
OFF,表示使用区间锁
On,表示事务自动提交
RR,事务隔离级别为可重复读
要模拟并发事务,需要修改事务自动提交这个选项,每个session要改为手动提交。
任何连上MySQL的session,都要手动执行:
set session autocommit=0;
以手动控制事务的提交。
图片
如上图,需要把session的autocommit设置为OFF。
可以看到,修改session变量,并不影响global变量,全局其他的session仍然是ON。
画外音:session变量默认继承global变量,也可以单独修改。
【查看死锁日志和内存使用情况 注意 是 innodb引擎】
show engine innodb status