mysql事务以及四种隔离级别的具体演示
在上图的表中执行回滚
可看到并没有发生变化,因为事务回滚到事务开启时的状态,并没有提交
可理解为修改后的数据(1000,1000)只保存到了内存,并没有提交到磁盘文件
并发事务处理带来的问题
举例演示
1.首先连上数据库,查看隔离级别,并更改隔离级别为最低 read uncommited
查看test表里面的内容
开始开启一个事务,最后未写commit,即没有结束
事务未结束,另开一个session,首先更改隔离级别,和上面一样
事务级别最低,session2已读到了脏数据
session1执行回滚(回滚也是代表结束事务)
session2再次读取数据,变回了原数据(也是一种不可重复读)
2. 将隔离级别为 read commited,然后开启事务,同样未结束
在session2 中同样更改隔离级别为read commited(此种级别可避免脏读)
并提交,未提交的话仍是在上一次的隔离级别(read uncommited)下读取的数据(会读到脏数据)
提交后成功更改隔离级别,未读到脏数据(避免了脏读问题)(脏数据指的是session1 中未提交的数据)
补充在session1中也应该提交,才能成功更改隔离级别。
事务未提交:
session1提交
session2再读,加上上一次读即连续两次读,读到不一样的数据(read commited级别下仍未避免不可重复读的问题)
记得session2收尾
3.更改事务级别为repeatable read
当前环境,记得commit,未结束
session1执行更改事务,更改数据,未提交
session2更改隔离级别并读取数据,未读到脏数据
接下来session1提交数据,表中的数据已更改为刘备
session2再读,避免了不可重复读,仍读到了上次session2窗口一样的数据,即对于同一个事务,同一次查询,应该要得到一样的数据
上一个事务提交后再开启一个新的事务,才会读到更新后的数据
接下来演示幻读,事务级别为repeatable read,不可避免幻读
查看当前表格内容,应该为刘备赵敏才是对的,由于没截到图。
session2中新插入一行内容,表格变为3行(刘备赵敏是对的)
session1再次更改表格,明明表格内容只有2行,发现变为3行数据发生了变化,发生了幻读(即session1在一次事务中读取到的数据发生了变化)。
再次查看变为了三行
4.更改为最高隔离级别,所有并发问题都可避免
简单总结
mysql 8.0中查看隔离级别指令 :
select @@transaction_isolation;
回滚