别废话,各种SQL到底加了什么锁?

简介: InnoDB:并发控制,MVCC,索引,锁... 一个SQL到底加了什么锁!?

一、普通select

(1)在读未提交(Read Uncommitted),读提交(Read Committed, RC),可重复读(Repeated Read, RR)这三种事务隔离级别下,普通select使用快照读(snpashot read),不加锁,并发非常高;

(2)在串行化(Serializable)这种事务的隔离级别下,普通select会升级为select ... in share mode;

【快照读】辅助阅读:

《InnoDB,并发如此之高的原因》

【事务隔离级别】辅助阅读:

《InnoDB,巧妙的实现四种事务的隔离级别》

二、加锁select

加锁select主要是指:

select ... for update

select ... in share mode

(1)如果,在唯一索引(unique index)上使用唯一的查询条件(unique search condition),会使用记录锁(record lock),而不会封锁记录之间的间隔,即不会使用间隙锁(gap lock)与临键锁(next-key lock);

【记录锁,间隙锁,临键锁】辅助阅读:

《InnoDB,索引记录上的三种锁》

举个栗子,假设有InnoDB表:

t(id PK, name);

表中有三条记录:

1, shenjian

2, zhangsan

3, lisi

SQL语句:

select * from t where id=1 for update;

只会封锁记录,而不会封锁区间。

(2)其他的查询条件和索引条件,InnoDB会封锁被扫描的索引范围,并使用间隙锁与临键锁,避免索引范围区间插入记录;

三、update与delete

(1)和加锁select类似,如果在唯一索引上使用唯一的查询条件来update/delete,例如:

update t set name=xxx where id=1;

也只加记录锁;

(2)否则,符合查询条件的索引记录之前,都会加排他临键锁(exclusive next-key lock),来封锁索引记录与之前的区间;

(3)尤其需要特殊说明的是,如果update的是聚集索引(clustered index)记录,则对应的普通索引(secondary index)记录也会被隐式加锁,这是由InnoDB索引的实现机制决定的:普通索引存储PK的值,检索普通索引本质上要二次扫描聚集索引。

四、insert

同样是写操作,insert和update与delete不同,它会用排它锁封锁被插入的索引记录,而不会封锁记录之前的范围。

同时,会在插入区间加插入意向锁(insert intention lock),但这个并不会真正封锁区间,也不会阻止相同区间的不同KEY插入。

【插入意向锁】辅助阅读:

《InnoDB,插入意向锁》

了解不同SQL语句的加锁,对于分析多个事务之间的并发与互斥,以及事务死锁,非常有帮助。

如果还没有厌倦这个话题,后文分解。

画外音:从阅读量看,貌似InnoDB系列已经有点腻了?我估计,是底层东西对写业务代码没啥用?

架构师之路-分享可落地的架构文章

相关推荐:

《InnoDB,并发如此之高的原因》1000+转发

《InnoDB,巧妙的实现四种事务的隔离级别》

《InnoDB,插入意向锁》

《InnoDB,索引记录上的三种锁》

《InnoDB,聚集索引与普通索引有什么不同?》

《索引,底层是如何实现的?》1000+转发

阅读原文

目录
相关文章
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
2114 0
|
SQL 关系型数据库 MySQL
Mysql系列-3.Mysql的SQL优化和锁(中)
Mysql系列-3.Mysql的SQL优化和锁
164 0
|
SQL 运维 监控
MSSQL性能调优实战:索引策略优化、SQL查询重写与智能锁管理
在Microsoft SQL Server(MSSQL)的运维中,性能调优是确保数据库高效运行、满足业务需求的关键环节
|
SQL 监控 数据库
MSSQL性能调优秘籍:索引深度优化、SQL重构技巧与高效锁策略
在Microsoft SQL Server(MSSQL)环境中,性能调优是确保数据库高效运行、满足业务快速增长需求的关键
|
SQL 存储 关系型数据库
Mysql-事务-锁-索引-sql优化-隔离级别
Mysql-事务-锁-索引-sql优化-隔离级别
|
SQL Java API
Flink超时问题之Flink sql cdc锁超时如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
SQL 数据库管理
DMS中执行SQL时,提示"获取不到锁"
DMS中执行SQL时,提示"获取不到锁"
339 3
|
SQL 关系型数据库 MySQL
Mysql系列-3.Mysql的SQL优化和锁(下)
Mysql系列-3.Mysql的SQL优化和锁
185 0
|
SQL 存储 关系型数据库
Mysql系列-3.Mysql的SQL优化和锁(上)
Mysql系列-3.Mysql的SQL优化和锁
151 0
|
SQL 存储 缓存
MySQL高级第三篇(共四篇)之应用优化、查询缓存优化、内存管理优化、MySQL锁问题、常用SQL技巧(一)
前面章节,我们介绍了很多数据库的优化措施。但是在实际生产环境中,由于数据库本身的性能局限,就必须要对前台的应用进行一些优化,来降低数据库的访问压力。
16360 7