一、锁的对象
InnoDb的行级锁是基于索引实现的,即枷锁的对象是索引而非具体数据。当加操作使用聚集索引时 ,Innodb会锁住聚集索引;而使用非聚集索引时,innodb会先锁住非主键索引,再锁定非聚集索引锁对应的聚集索引。
行级锁的加锁条件必须有对应的索引项,否则会退化为表级锁。
二、共享锁
共享锁又称读锁(S锁),当一个事务获取了某行数据的共享锁,其他事务亦可获得该行数据的共享锁,但不能获取该行数据的排他锁。即:共享锁间相互兼容,但与排他锁互斥;
select column from table ... LOCK INSHARE MODE //显示加锁,当前读
在可重复读隔离级别下,所有未通过LOCK INSHAER MODE显示加锁的select 语句都是快照读,快照读不会对所属数据行加共享锁;
在获取某行数据行的共享锁时,必须先获取该数据行所在表的意向共享锁。
三、排他锁
排他锁又称写锁(X锁),当一个事务获取了某行数据的排他锁,其他事务既不可以获取该行数据的共享锁,也不可以获取该行数据的排他锁。即:排他锁与任何锁互斥。
select column from table ... FOR UPDATE //显示加锁 update table SET a=1 where id=1 //隐式加锁update、insert、delete
在获取某行数据的排他锁前,必须先获取该数据行所在表的意向排他锁。
四、意向锁
意向共享锁:事务有意向对表中某些行加共享锁
意向排他锁:事务有意向对表中的某些行加排他锁
意向锁是一种不与行级锁冲突的表级锁
作用: 如果一个事务试图在表级别上添加共享锁或者排他锁,则会受到其他事务控制的表级别意向锁的阻塞。该事务锁定该表前不必检查各个页或行锁,而只需要检查表上的意向锁。
五、记录锁
记录锁是对索引记录的锁定
select * from t where id = 10 for update
六、间隙锁
间隙锁是对索引之间间隙的锁定,亦或是对第一个索引记录之前或最后一个索引记录之后的间隙的锁定
间隙锁存在的唯一目的是防止其他事务插入区间。间隙锁是可以共存的,一个事务持有的间隙锁不会阻止另一个事务对相同区域进行锁定。
七、临键锁(NEXT KEY LOCK)
八、自增锁
自增锁是在对含有AUTO_INC列的表进行插入操作时,产生的一种特殊的表锁。
在最简单的情况下,如果一个事务正在向表中插入值,且该表存在自增列,则任何其他事务在该表中进行插入操作都会被阻塞。
自增锁并不是在一个事务完成之后才释放,而是在插入自增值的sql语句执行完成后就立即释放。