关于mysql:MySQL学习笔记5事务到底是隔离的还是不隔离的

5次阅读

共计 1203 个字符,预计需要花费 4 分钟才能阅读完成。

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_id<transaction id,则只能去 undo log 里去取。去 undo log 查找数据的时候,也须要做比对,必须 up_limit_id>transaction 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,可反复读)隔离级别的实现。

正文完
 0