所有文章
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锁,它们之间相互兼容情况如上表所示。