row_level: shared(S) locks、exclusive(X) locks
T1 hold S on row r,T2 can hold S on row r too.
Intention Locks(意图锁)
使用意图锁来使InnoDB支持多粒度锁(允许记录锁和表锁共存)
意图锁用来表明一个事物将在此表中需要S或者X锁,使用IS、IX来表明事务使用的记录锁的类型。
IS: 用来设置S锁
IX:用来设置X锁
要想设置S锁,必须先持有IS锁或者更强的锁
要想设置X锁,必须先持有IX锁
意图锁不会锁住任何东西(除非全表处理请求)
意图锁的目的是为了表明其它事务正在持有记录锁或者将要锁住记录。
等待锁的事务队列默认200上限。LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK
设置
LOCK_MAX_N_STEPS_IN_DEADLOCK_CHECK
是锁限制,超过此限制将回滚
record-level:record locks,gap locks,next-key locks。
Record locks: on an index record.
Gap locks: a gap between index records,or a lock on the gap before the first and the last index record.
Next-key locks:a combination of a record lock on the index record and a gap lock on the gap before the index record.
记录锁是作用到索引记录上的,即使表中没有索引,但是InnoDB将创建一个隐藏的聚簇索引。
Clustered and Secondary Indexes(聚簇索引和第二索引)
聚簇索引和主键一样。
1)如果在表中定义了一个主键,假设没有非唯一且非空或者集合列,InnoDB将创建一个新自增列。
2)如果没有定义主键,Mysql将第一个非空唯一索引作为聚簇索引。
3)如果表中没有主键和满足条件的唯一索引,InnoDB内部将在生成一个以行ID的隐藏聚簇索引。
使用Next-key Locks来解决幻读问题。
insert操作时,gap locks将提前调用insert intention gap lock.
值得一提的是不同的事务之间持有gap锁可能产生冲突。例如事务A持有gap S-lock,同时在同一gap上,事务B持有gap X-lock,此处冲突的原因是如果一条在索引上的记录被purged,不同事务持有的gap locks必须合并。
gap X-lock和 gap S-lock具有一样的效果。innodb_locks_unsafe_for_binlog
enable可以禁用gap lock
显式锁和隐式锁
显式锁是S、X锁
隐式锁是Record locks、Gap locks、Next-key locks