隔离级别的实验|学习笔记

简介: 快速学习隔离级别的实验

开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术隔离级别的实验学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/80/detail/15921


隔离级别的实验

 

MySQL8.0的数据库的上做四个实验,看四种事物的隔离级别是怎样处理章读问题,不可重复读的问题,还有换读的问题。

image.png

MySQL 的数据库用的时候8.0,所以首先来看一下数据库的全局的事务隔离性。可以看到它的事务隔离性是 REPEATABLE- READ,当前会话的事务隔离性也是REPEATABLE- READ,这是两个不同的概念。

isolation的这个属性所设事物的隔离的级别是会话的隔离级别,也是看到的第二

个这个字。所以后面的所有实验都是在会话的事务隔离级别上的来做。

现在看到的是它的会话事务隔离级别跟全局的事务隔离级别是一致的。所以首先把它的会话的事务隔离级别设成了 read uncommitted。看看两个窗口,把这两个窗口的会话的事务隔离级别都设成了这个 read committed,预计在一个会话中间,

在一个数中间对数据库的修改。

其实就算本来还没有提交这个数,在另外一个会话中间也能够看见。所以设好了以后,分别看一下这两个会话的事务隔离级别,当前的会话事务隔离级别都变成了这个 read uncommitted。可以看到这个,这边看一下其实它也变成了read uncommitted。使用 oomn demo之间 oomn11- product这个数据表,首先分别开启事务,两个会话窗口都开启事务。

所以先看一下这个 oomn11-product这个表,这是产品的规格信息,其中有一个是规格的库存信息,就是 stock,打算来修改库存的量,stock 的值。在另外一个过程也看一下,这两个中间看到的 product信息都是一致的,所以要在一个部分中间update 语句去修改 product中间的stock值,它的库存量,把这个库存量设成99,只是把 ID等于一的这个规格的库存量增加一个需求。设完了以后,虽然还没有提交事务,但是在这个会话里面就能看到它变成99了。由于现在的事务的隔离级别是

read uncommitted,所以在另外一个会话中间去看一下它的值。

它能够看到在第一个会话中间还没有提交的这个事务。这时它改成了99,现在第一个方案中间把这个事务回滚回去,所以再去看的话,它变成了100。实际上它的这个事务的最后的值stock还是100,当然在这边也能看到它改成100了。所以这就是read uncommitted 的起点,它能够读到另外一个会话中间在事务中间还没有提交的之前的这个中间过程。

再来看第二个,把它的事务隔离级别设成了 read uncommitted,这样让它能够读到事务提交以后的字。所以先用 session 命令把它设成 read uncommitted的值。然后来看一下它的会话的 session.transaction-isolation的值是多少。可以看到它已经变成了 read uncommitted。

但在这边的第二句话中间,同样把它的这个事物的隔离级别,会话的事务隔离级别也改成了 read uncommitted,所以看一下它的会话的事务隔离级别也感受到 read uncommitted,然后同样两个会话中间分别开启事务。同样准备去修改oomn11- product表里的库存信息,所以先看一下修改之前的库存信息是多少。还是100,同样用 update语句把它的库存信息,库存量修改成为99。把ID等于一的这个规格的库存信息修改为99。在提交之前,先在第二个部分中间看一下 product库存量是多少。这个时候显示的应该是跟第一个会话中间是相同的值100。

image.png

所以这边执行一条 update语句在第一个会话中间,这时候没有提交事务,但是第一个会话中间看到它被设成99了,第二个中间可以看到它还是100。然后在第一个会话中间,把这个事务提交,在第二个会话中间就能看到提交以后的数据99,这就是 read uncommitted的隔离级别。那这个隔离级别上中间的数据是看不到的,只能看到会话事务提交以后的数据。那第三个实验,把会话的隔离级别提升到repeatable read 这个级别。其实先不用设,因为是 MySQL 8.0的默认的这个级别就是 repeatable read,所以就不需要再去做那样的一个设定语句。所以看一下三个会话的隔离级别都是 repeatable read。

image.png

三个会话中间分别开始一个事务。然后在第一个会话中间,怎么去修改库存量?但是在修改它的库存量之前,先在第二个会话中间去查一下这个库存量多少。然后在第一个会话中间修改库存量,提交以后,再到第二个会话中间去看一下是什么,然后再到第三个中间去看一下的是什么。

所以先看一下这个库存量,现在可以看到这个第一个ID为一的规格的库存量是100,这第一个会话中间和第二个会话中间,先看一下,那第三个不看啊,等到它事务提交以后再来看。所以两个会话中可以看到它的库存量都是100。先在第一个事务中间修改它的库存量到99。把 ID为一的这个规格的销量修改成为99,然后把事务提交。那在这里看一下啊,因为它提交以后可以看到它的库存量已经改99。在第二个事务中间,可以看到它看到的这个库存量依然是100,所以说明它在第一个事务在更新之前看过一次是100,它在第一个事物提交完了以后,再看的话,它还

是100。

就是说它的这个事务开始了,它看过的这个数据它永远都会是一样的,所以这样做。但是第三个事务,因为它之前没看过,所以在第一个事务已经提交的时候,再

去看的话,会发现它的这个库存量就是99,跟第一个的会话是一样的。

image.png

那最后一个实验来尝试一下 try 型的事务隔离级别,主要解决换读问题。不再去修改数值,而是往里面加入新的产品规格。所以修改了完了以后,在两个会话中间分别看一下它当前会话的事务隔离级别都改成了 try型。在第一个会话中间开启一个

事务,在第二个会话中间也开启一个事务。

在第一个会话中间插入一条新的产品规格,先分别看一下两个会话中间产品规格的信息。这是三条产品规格信息,怎样在第一个会话中间插入一天新的产品规格信息?在插入的时候会发现这条语句会停在这,原因是第二个会话已经开始了一个事务,而且在查看这张表的信息所以会使第一个会话的操作被停下来,等待第二个会

话中间事务结束。

所以第二个会话事务结束就可以看到第一个会话的数据被插进去。


相关文章
|
6月前
|
数据库
数据库系列课程(14)-脏读、不可重复读、幻读
数据库系列课程(14)-脏读、不可重复读、幻读
25 0
|
11月前
|
存储 SQL 关系型数据库
第13章_事务基础知识(上)
第13章_事务基础知识
63 0
|
12月前
|
SQL 存储 NoSQL
「数据库架构」三分钟搞懂事务隔离级别和脏读
「数据库架构」三分钟搞懂事务隔离级别和脏读
|
SQL Oracle 关系型数据库
隔离级别引发问题实验
隔离级别引发问题实验
74 0
隔离级别引发问题实验
|
存储 关系型数据库 MySQL
Mysql事务隔离级别和MCVV(多版本并发控制)附图 ✨ 每日积累
Mysql事务隔离级别和MCVV(多版本并发控制)附图 ✨ 每日积累
Mysql事务隔离级别和MCVV(多版本并发控制)附图 ✨ 每日积累
|
关系型数据库 MySQL Java
实战分析:事务的隔离级别和传播属性(上)
实战分析:事务的隔离级别和传播属性(上)
实战分析:事务的隔离级别和传播属性(上)
|
存储 关系型数据库 数据库
实战分析:事务的隔离级别和传播属性(下)
实战分析:事务的隔离级别和传播属性(下)
实战分析:事务的隔离级别和传播属性(下)
|
SQL Java
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(5)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(5)
117 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(5)
|
SQL 关系型数据库 MySQL
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(1)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(1)
164 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(1)
|
SQL 关系型数据库 MySQL
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(3)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(3)
128 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(3)