三歪连MVCC和事务隔离级别的关系都不知道...

时间:2020-11-01 11:04:35   收藏:0   阅读:25

不经一番寒彻骨,怎得梅花扑鼻香

前言

数据库存在几种事务隔离级别我想不用我说,大家也都知道的吧?
什么?还不知道?还不知道就自己去补课,我默认大家都知道了。算了我是暖男,在贴一下给大家看看,下次可别忘了哈。
技术图片
有四种:

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;//等级就是上面的几种

怎么启动的?

启动事务一般就是:

  1. 显式启动事务语句, begin 或 start transaction,配套的提交语句是commit,回滚语句是rollback。
  2. set autocommit=0,这个命令会将这个线程的自动提交关掉,意味着如果你只执行一个select语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行commit 或 rollback 语句,或者断开连接。

我在书中看到都是不要建议大家使用自动的,我看了一下我们的场景,倒是很少主动启动事务的,因为我们单个库的场景不多,更多都是分布式事物。
但是长事务是大家需要注意的,因为一旦set autocommit=0自动开启事务,所有的查询也都会在事务里面了,有慢SQL那数据库也容易被拖垮的。
我最近就遇到了这样的问题,数据库经常接到报警,其中就有长事务导致的问题。

视图

首先得说一下,我后面所有的知识都是基于InnoDB的,因为MyISAM不支持事务。
视图,这是事务隔离实现的根本,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。
在MySQL里,有两个“视图”的概念:

show variables 

技术图片
资料参考:《MySQL 是怎样运行的:从根儿上理解 MySQL》、《高性能MySQL》、《 MySQL 实战 45 讲》

总结

从上边的描述中我们可以看出来,所谓的MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用读已提交(READ COMMITTD)、可重复读(REPEATABLE READ)这两种隔离级别的事务在执行普通的SELECT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。
这两个隔离级别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,数据的可重复读其实就是ReadView的重复使用。
这样去解释这些技术,主要是希望大家对现象背后的本质多点思考,不然你去背出这几种隔离级别,以及各种数据现象是没有任何意义的,实际开发过程中真的出现了问题,你不懂本质以及过程,你去排查也会很难受的,到头来还是要看书,看资料。
我是敖丙,一个在互联网苟且偷生的程序员。
你知道的越多,你不知道的越多,人才们的 【三连】 就是丙丙创作的最大动力,我们下期见!

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!