mysql事务以及四种隔离级别的具体演示

mysql事务以及四种隔离级别的具体演示
mysql事务以及四种隔离级别的具体演示

mysql事务以及四种隔离级别的具体演示

mysql事务以及四种隔离级别的具体演示
mysql事务以及四种隔离级别的具体演示

mysql事务以及四种隔离级别的具体演示
mysql事务以及四种隔离级别的具体演示

在上图的表中执行回滚
mysql事务以及四种隔离级别的具体演示

可看到并没有发生变化,因为事务回滚到事务开启时的状态,并没有提交
可理解为修改后的数据(1000,1000)只保存到了内存,并没有提交到磁盘文件

mysql事务以及四种隔离级别的具体演示

并发事务处理带来的问题

mysql事务以及四种隔离级别的具体演示
mysql事务以及四种隔离级别的具体演示

举例演示
1.首先连上数据库,查看隔离级别,并更改隔离级别为最低 read uncommited

mysql事务以及四种隔离级别的具体演示

查看test表里面的内容

mysql事务以及四种隔离级别的具体演示

开始开启一个事务,最后未写commit,即没有结束

mysql事务以及四种隔离级别的具体演示

事务未结束,另开一个session,首先更改隔离级别,和上面一样

mysql事务以及四种隔离级别的具体演示

事务级别最低,session2已读到了脏数据

mysql事务以及四种隔离级别的具体演示

session1执行回滚(回滚也是代表结束事务)

mysql事务以及四种隔离级别的具体演示

session2再次读取数据,变回了原数据(也是一种不可重复读)

mysql事务以及四种隔离级别的具体演示

2. 将隔离级别为 read commited,然后开启事务,同样未结束

mysql事务以及四种隔离级别的具体演示

在session2 中同样更改隔离级别为read commited(此种级别可避免脏读)

mysql事务以及四种隔离级别的具体演示

并提交,未提交的话仍是在上一次的隔离级别(read uncommited)下读取的数据(会读到脏数据)

mysql事务以及四种隔离级别的具体演示

提交后成功更改隔离级别,未读到脏数据(避免了脏读问题)(脏数据指的是session1 中未提交的数据)

mysql事务以及四种隔离级别的具体演示

补充在session1中也应该提交,才能成功更改隔离级别。

mysql事务以及四种隔离级别的具体演示

事务未提交:

mysql事务以及四种隔离级别的具体演示
mysql事务以及四种隔离级别的具体演示

session1提交

mysql事务以及四种隔离级别的具体演示

session2再读,加上上一次读即连续两次读,读到不一样的数据(read commited级别下仍未避免不可重复读的问题)

mysql事务以及四种隔离级别的具体演示

记得session2收尾

mysql事务以及四种隔离级别的具体演示

3.更改事务级别为repeatable read
当前环境,记得commit,未结束

mysql事务以及四种隔离级别的具体演示

session1执行更改事务,更改数据,未提交

mysql事务以及四种隔离级别的具体演示

session2更改隔离级别并读取数据,未读到脏数据

mysql事务以及四种隔离级别的具体演示

接下来session1提交数据,表中的数据已更改为刘备

mysql事务以及四种隔离级别的具体演示

session2再读,避免了不可重复读,仍读到了上次session2窗口一样的数据,即对于同一个事务,同一次查询,应该要得到一样的数据

mysql事务以及四种隔离级别的具体演示
mysql事务以及四种隔离级别的具体演示
mysql事务以及四种隔离级别的具体演示

上一个事务提交后再开启一个新的事务,才会读到更新后的数据

mysql事务以及四种隔离级别的具体演示

接下来演示幻读,事务级别为repeatable read,不可避免幻读
查看当前表格内容,应该为刘备赵敏才是对的,由于没截到图。

mysql事务以及四种隔离级别的具体演示

mysql事务以及四种隔离级别的具体演示

session2中新插入一行内容,表格变为3行(刘备赵敏是对的)

mysql事务以及四种隔离级别的具体演示

session1再次更改表格,明明表格内容只有2行,发现变为3行数据发生了变化,发生了幻读(即session1在一次事务中读取到的数据发生了变化)。

mysql事务以及四种隔离级别的具体演示

再次查看变为了三行
mysql事务以及四种隔离级别的具体演示

4.更改为最高隔离级别,所有并发问题都可避免

mysql事务以及四种隔离级别的具体演示
mysql事务以及四种隔离级别的具体演示
简单总结
mysql事务以及四种隔离级别的具体演示
mysql 8.0中查看隔离级别指令 :
select @@transaction_isolation;

回滚
mysql事务以及四种隔离级别的具体演示