MYSQL中Innodb表锁详解

表锁(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、意向锁在保证并发性的前提下,实现了行锁和表锁共存且满足事务隔离性的要求

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值