标签归档:InnoDB

InnoDB锁

共享锁(S)、排他锁(X)见:事务的几个概念

意向共享(IX)、意向排他(IX)

InnoDB提供了非锁定读:不需要等待访问行上的锁释放,读取行的一个快照

InnoDB有三种行锁的算法:

1,Record Lock:单个行记录上的锁。(查询的索引含有唯一属性的时候,Next-Key Lock 会进行优化,将其降级为Record Lock,即仅锁住索引本身,不是范围。)

2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。

3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。(查询的索引无唯一属性的时候出现,InnoDB存储引擎还会对辅助索引下一个键值加上gap lock),锁定半闭区间;

显式的关闭Gap Lock:

1:把事务隔离级别改成:Read Committed,提交读、不可重复读。SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

2:修改参数:innodb_locks_unsafe_for_binlog 设置为1。(当这个参数设置为true的时候,将不会对select的结果集加锁,但是这样的设置将可能带来非常严重的隐患。如果使用这个binlog进行从数据库的恢复,或者进行主数据库的灾难恢复,都将可能和主数据库的执行效果不同。)

InnoDB各隔离级别下的锁(非唯一属性索引上):

create table tb_test(id int,name char(50),key idx_1(id));

select * from tb_test where id=8 for update;
Record Lock Gap Lock Next-Key Lock
REPEATABLE READ
READ COMMITTED
READ UNCOMMITTED
SERIALIZABLE

mysql的innodb锁的其他介绍见:mysql事务隔离机制

参考:Innodb锁机制:Next-Key Lock 浅谈

锁的优化