- 在说MVCC之前呢?我们先需要对那些不太了解MySQL的兄弟们,先普及普及MySQL一些基本知识,具体MVCC内容往后看哦。
我们通过案例一步一步查看MySQL的MVCC到底是什么东西。 **
- 在MySQL当中,只有使用了InnoDB存储引擎的数据库表才支持事务。
- 有了事务就可以用来保证数据的完整以及一致性,保证成批的SQL语句要么全部执行,要么全部不执行。
- 事务用来管理insert、update、delete语句。
1、四个特性(ACID):
- **原子性:**一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- **一致性:**在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- **隔离性:**数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- **持久性:**事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
2、隔离级别
**
- 读未提交(Read uncommitted),一个事务可以读取到其他事务中做出操作且还未提交的数据。会出现脏读,不可重复读,幻读现象。
- 读已提交(Read committed),一个事务只能读取到其他事务中做出操作且已经做出提交的数据。会出现不可重复度,幻读现象。
- 可重复读(Repeatable read),同一个事务内多次查询的数据保持一致。会出现幻读
- 串行化(Serializable )是高的隔离级别,它求在选定对象上的读锁和写锁保持直到事务结束后才能释放,所以能防住上诉所有问题,但因为是串行化的,所以效率较低.
3、幻读、不可重复读、脏读
脏读:当一个事务读取到其他事务还未提交的数据,因为未提交的数据,不一定是最终有效的数据。所以我们称为读到脏数据了。也就是脏读。 不可重复读:一个事务A读取数据之后,另外一个事务B将此数据修改,此时事务A再次查询,发现数据不一样了。这就是不可重复读。也可以叫做幻读。 幻读:又叫"幻象读",是''不可重复读''的一种特殊场景:当事务1两次执行''SELECT ... WHERE''检索一定范围内数据的操作中间,事务2在这个表中创建了(如[[INSERT]])了一行新数据,这条新数据正好满足事务1的“WHERE”子句。 注:可能有点绕,一般情况下,“不可重复读”和“幻读”大致的意思相同。只不过不可重复度是在数据行上发生的,也就是发生了update操作,再去读取这条数据,出现不可重复读。而幻读是在数据表上发生的,也就是发生了insert与delete操作。再去读取这张表,出现数据条目或者行数(记录数)不一样。出现了幻觉一样。 **
4、MVCC(Multiversion Concurrency Control)多版本并发控制
数据库用于处理读写冲突的一种手段,目的在于提交数据库高并发场景下的吞吐性能。 版本链: 对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我