表锁(Table Lock)
表级别的S锁、X锁:在对某个表执行增删改查语句的时候,Innodb存储引擎不会为这个表添加表级别的S锁或者X锁的,但在对表进行ALTER TABLE、DROP TABLE这类的DDL语句时,其他事务对这个表并发执行增删改查就会发生阻塞。这个过程其实是通过Server层使用一种称为元数据锁来实现的
一般情况下,不会使用Innodb存储引擎体用的表级别的S锁和X锁,只会在一些特殊情况下使用,比如崩溃恢复过程中用到。
LOCK TABLES t READ:innodb存储引擎会对t表加表级别的S锁
LOCK TABLESt WRITE:innodb存储引擎会对表t加表级别的X锁
不过要尽量避免在使用Innodb存储引擎上使用LOCK TABLES这样的手动锁表语句,并不会提供什么额外的保护,只会降低并发能力而已,Innodb的厉害之处还是在于实现了更粒度的行锁。
意向锁:Innodb支持多粒度锁,它允许行级锁与表级锁共存,而意向锁就是其中一种表锁。
意向锁又分为两种
意向共享锁:事务有意向对表中的某些行加共享锁(S锁)
事务要获取某些行的S锁,必须先获得表的IS锁
select column from table … lock in share mode;
意向排他锁:事务有意向对表中的某些行加排它锁(X锁)
事务要获取某些行的X锁,必须先获得表的IX锁
select column from table … fro update;
注:意向锁是有存储引擎自己的维护的,用户无法手动操作意向锁,在为数据行加共享/排它锁之前,Innodb会先获取该数据行所载数据表对应的意向锁。
意向锁的并发性:意向锁不会与行锁的共享/排它锁互斥,正因为如此,意向锁并不会影响到多个事务对不同数据行加排它锁时的并发性(不然直接用普通的表锁就行了)
小结:
1、Innodb支持多粒度锁,特定场景下,行级锁可以与表级锁共存。
2、意向锁之间互不排斥,但除了IS与S兼容外,意向锁会与共享锁(读锁)/排它锁(写锁)
3、IX、IS是表级锁,不会和行级的X,S锁发生冲突,只会和表级的X,S发生冲突。
4、意向锁在保证并发性的前提下,实现了行锁和表锁共存且满足事务隔离性的要求