一条简单的更新语句,MySQL是如何加锁的?
看如下一条sql语句: # table T (id int, name varchar(20)) delete from T where id = 10 ; MySQL在执行的过程中,是如何加锁呢? 再看下面这条语句: select * from T where id = 10 ; 那这条语句呢?其实这其中包含太多知识点了。要回答这两个问题,首先需要了解一些知识。 相关知识介绍 多版本并发控制 在MySQL默认存储引擎InnoDB中,实现的是基于多版本的并发控制协议——MVCC(Multi-Version Concurrency Control)(注:与MVVC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。其中MVCC最大的好处是:读不加锁,读写不冲突。 在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的提高了系统的并发性能,在现阶段,几乎所有的RDBMS,都支持MVCC。其实,MVCC就一句话总结:同一份数据临时保存多个版本的一种方式,进而实现并发控制。 当前读和快照读 在MVCC并发控制中,读操作可以分为两类:快照读与当前读。 快照读(简单的select操作):读取的是记录中的可见版本(可能是历史版本),不用加锁。这你就知道第二个问题的答案了吧。 当前读(特殊的select操作、insert、delete和update)