锁本身就是用于并发控制的,那么为什么InnoDB还要引入MVCC,读写都加锁不就可以控制住并发吗?
锁确实可以,但是性能太差。如果是纯粹的锁,那么写和写、读和写、读和读之间都是互斥的。如果是读写锁,那么写和写、读和写之间依旧是互斥的。
数据库和一般的应用有一个很大的区别,就是数据库即使是读,也不能被写阻塞住。
所以数据库要有一种机制,避免读写阻塞。在理解了为什么MVCC必不可少后,现在你需要进一步了解一个和MVCC紧密关联的概念:隔离级别。
数据库的隔离级别是一组规则,用来控制并发访问数据库时如何分配、保护和共享资源。不同的隔离级别在不同的并发控制策略之间进行调整,从而提供了不同的读写隔离级别和安全性。隔离级别代表了一个事务是否了解别的事务以及了解程度怎么样。
MySQL的隔离级别有四个。
读未提交
Read Uncommitted
是指一个事务可以另外一个事务尚未提交的修改读已提交
Read Committed
是指一个事务只能看到已经提交的事务的修改。如果在事务执行过程中有别的事务提交了,那么事务还是能够看到别的事务最新提交的修改。可重复读
Repeatable Read
是指在这一个事务内部读同一个数据多次,读到的结果都是同一个。这意味着,即使在事务执行过程中有别的事务提交,这个事务依旧看不到别的事务提交的修改。这是MySQL默认的隔离级别。串行化
Serializable
是指事务对数据的读写都是串行化的
从上到下,隔离性变强了但是性能变差了,所以一个提升MySQL性能最简单的方式,就是把隔离级别往下调,这也是我们的一个亮点方案。