MySQL实战45讲之2.事务隔离级别

2.事务隔离级别

读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。
可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
串行:我的事务尚未提交,别人就别想改数据。
这4种隔离级别,并行性能依次降低,安全性依次提高。

2.1事务隔离的实现原理

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。

在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。

在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。

“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;

而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

2.2关于其中读已提交和可重复读的具体实现

创建read_view,其实就是当前的事务拍了个快照,会记录【当前时刻】的一些事务id,包括进行中的、已提交的、尚未开始的等等;引擎可以根据这个read_view + 回滚段,找到【快照时刻】的数据。如果事务期间,我们一直用同一个read_view去查数据,自然可以保证【可重复读】了。而【提交读】是需要【每次都读到最新已提交】的数据的,所以每次执行SQL都创建一个全新的read_view,以保证该特性。
【提交读】不创建read_view行不行?不行,因为当前【数据页】中最新的数据是【有可能未提交】的,没有read_view作为依据,是无法确定到哪个位置(数据页/回滚段)找到已提交的数据的。相对地,【未提交读】则不需要read_view,直接获取数据页中最新的数据(不管是否提交,所以有可能会出现脏读)。

2.3不同的事务隔离级别又会造成哪些问题呢?

1.脏读:

当数据库中一个事务A正在修改一个数据但是还未提交或者回滚,
另一个事务B 来读取了修改后的内容并且使用了,
之后事务A提交了,此时就引起了脏读。

此情况仅会发生在: 读未提交的的隔离级别.

2.不可重复读:

在一个事务A中多次操作数据,在事务操作过程中(未最终提交),
事务B也才做了处理,并且该值发生了改变,这时候就会导致A在事务操作
的时候,发现数据与第一次不一样了。 就是不可重复读。

此情况仅会发生在:读未提交、读提交的隔离级别.

3.幻读

事务a 开启, 查询符合条件的数据 ,发现有10条, 准备将这10条记录修改, 此时事务b开启, 插入了一条符合事务a查询条件的记录. 提交事务, 回到事务a, a也提交事务, 当再次查询到时候, 发现修改了11条..感觉发生了幻觉一样. 此为幻读.

posted @ 2020-07-24 17:31  wswgot  阅读(121)  评论(0编辑  收藏  举报