一、innodb基本的行级锁和表级锁

时间:2022-05-31 02:08:27

所有文章

https://www.cnblogs.com/lay2017/p/12078232.html

 

正文

innodb是mysql在oltp模式中最常用的一种执行引擎。本文将了解一下innodb基础的行级锁和表级锁。

首先,锁存在的理由是什么?是因为资源争抢,当多线程并发的时候,为了保证资源不被破坏,需要对资源的调用情况进行控制,比如该阻塞排队(互斥)的时候,该并行查询的时候(共享)。

innodb主要分为两种锁模式

1)行级锁,行级锁又再细分为

  1-1)共享锁,也称为S锁:IS锁允许多个事务去读取同一行数据,阻止其它事务获得X锁更新同一行数据。简单来说,读读不互斥、读写互斥。

  1-2)排它锁,也称为X锁:只允许获得X锁的事务更新数据,阻止其它事务获取S锁和X锁,也就是不能读也不能更新。简单来说,读写互斥,写写互斥。

2)表级锁,表级锁又再细分为

  2-1)意向共享锁,也称为IS锁:事务打算给数据行加S锁,就先取得表的IS锁。简单来说,就是先获取整张表的全局锁(IS),然后再给每条数据加行锁(S锁)。

  2-2)意向排它锁,也称为IX锁:事务打算给数据行加X锁,就先取得表的IX锁。简单来说,就是先获取整张表的全局锁(IX),然后再给每条数据加行锁(X锁)。

行锁和表锁的兼容情况

 

  锁模式 互斥锁(X) 意向互斥锁(IX) 共享锁(S) 意向共享锁(IS)
锁模式 是否兼容        
互斥锁(X)   冲突 冲突 冲突 冲突
意向互斥锁(IX)   冲突 兼容 冲突 兼容
共享锁(S)   冲突 冲突 兼容 兼容
意向共享锁(IS)   冲突 兼容 兼容 兼容

 

如果一个事务请求的锁与当前的锁兼容,那么innodb就将请求的锁授予该事务。否则,就得等待锁的释放。

 

总结

innodb分为行级锁和表级锁。两者又再细分为了S锁、X锁和IS锁、IX锁,它们之间相互兼容情况如上表所示。

参考链接:https://zhuanlan.zhihu.com/p/29150809