MySQL学习笔记-5-事务到底是隔离的还是不隔离的

I、事务的启动时机

事务在启动时会拍一个快照,这个快照是基于整个库的。即一个事务内,整个库的修改对于该事务都是不可见的(对于快照读的情况)。如果在事务内select t表,另外的事务执行了DDL t表,根据发生时间,会出现锁住或者报错。
1、一致性视图是在执行第一个快照读语句时创建的:begin/start transaction命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动。
2、一致性视图是在执行 start transaction with consistent snapshot 时创建的:如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令。

II、隔离级别实现

Innodb支持RC和RR隔离级别实现是用的一致性视图(consistent read view)

III、事务是如何实现的MVCC

1、每个事务都有一个事务ID,即严格递增的transaction id;
2、事务在启动时,找到已提交的最大事务ID记为up_limit_id;
3、事务在更新一条语句时,比如id=1改为了id=2,会把id=1和该行之前的row trx_id写到undo log里,并且在数据页上把id的值改为2,并且把修改这条语句的transaction id记在该行行头;
4、再定一个规矩,一个事务要查看一条数据时,必须先用该事务的up_limit_id与该行的transaction id做比对,如果up_limit_id>=transaction id,那么可以看。如果up_limit_idtransaction id,才返回数据。

IV、什么是当前读

由于当前读都是先读后写,只能读当前的值,所以为当前读。会更新事务内的up_limit_id为该事务的transaction id。

V、为什么rr能实现可重复读而rc不能

1、快照读的情况下,rr不能更新事务内的up_limit_id,而rc每次会把up_limit_id更新为快照读之前最新已提交事务的transaction id,则rc不能可重复读;
2、当前读的情况下,rr是利用record lock+gap lock来实现的,而rc没有gap,所以rc不能可重复读。

VI、MYSQL两个视图概念

1、一个是 view。它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法是 create view … ,而它的查询方法与表一样。
2、另一个是 InnoDB 在实现 MVCC 时用到的一致性读视图,即 consistent read view,用于支持 RC(Read Committed,读提交)和 RR(Repeatable Read,可重复读)隔离级别的实现。

你可能感兴趣的:(mysql)