结合图文一起搞懂 MySQL 事务、MVCC、ReadView!

前言

上次讲完MySQL的三大日志 undolog、redolog、binlog后,有必要把关于MySQL事务分析的文章马上给续上,我们知道在多并发事务处理的MVCC【多版本并发控制】中是有涉及到undo log日志的。

不过我们要明确一点MySQL的InnoDB存储引擎支持事务, MyISAM 存储引擎是不支持事务。

📚 全文字数 : 9k+

⏳ 阅读时长 : 13min

📢 关键词 : 事务、事务隔离级别、MVCC、ReadView

阅读之前,提前了解下全文大纲,对阅读内容有个先前了解,这样对事务这块了解程度不同的朋友就可以选择不同的章节去读了。

什么是mysql事务?

Mysql事务(Transaction)用于保证数据的一致性,事务是在数据库管理系统中执行的一个逻辑操作单元,它是由一组列数据库操作组成的逻辑工作单元。

这一组操作要么全部成功,要么全部失败,不存在部分成功部分失败的情况,所有的操作共进退,因此事务是一个不可分割的逻辑单元,举个案例。

   现在A、B发生了转账行为(假设都有10w元,小明给小红转账10w元)<br>    -- 从A账户减去5w元<br>    UPDATE account SET money = money - 50000 WHERE name = "A";<br>    -- 小红对应的账户增加100元<br>    UPDATE account SET money = money + 50000  WHERE name = "B";<br>    -- 说明:<br>    上面的2条SQL可以被认为是一个事务<br>   其中有任何一条SQL语句执行错误或系统宕机都会导致数据恢复到最初执行这两条语句前(ROLLBACK)<br>    但是这两条SQL都执行成功的话则会提交事务(COMMIT)

  • • 【读未提交】隔离级别:可能发生脏读、不可重复读和幻读现象;

  • • 【读提交】隔离级别:可能发生不可重复读和幻读现象,但是不可能发生脏读现象;

  • • 【可重复读】隔离级别:可能发生幻读现象,但是不可能脏读和不可重复读现象;

  • • 【串行化】隔离级别:不会发生脏读、不可重复读和幻读现象

如何设置隔离级别

我们来验证MySQL默认的隔离级别是不是可重复读,可通过 show variables like 'transaction_isolation' 命令查。

// mysql 5.7之后查看隔离级别<br>show variables like 'transaction_isolation'; <br><br>+---------------+-----------------+<br>| Variable_name | Value           |<br>+---------------+-----------------+<br>| tx_isolation  | REPEATABLE-READ |<br>+---------------+-----------------+