一说起mysql中的事务隔离级别,我们都知道有四种,分别是读取为提交的,读取已提交的,可重复读,串行化等等。现在我们来分别演示一下这几种隔离级别。
1、准备工作
1、开两个窗口,分别都登录mysql
2、选择数据库,这里我特意创建了一个test数据库,里面有一张user表
3、查询一下user表中数据,没啥太大问题
4、关闭自动提交,这一点很重要,两边都要设置。到此为止,我们的准备工作就完成了
2、读取未提交
1、设置隔离级别为读取未提交
set session transaction isolation level read uncommitted;
2、两边都开启事务,begin
对比左右两边的数据,最开始执行查询语句select * from user;左右两边查找到的数据是一致的,此时左边的事务执行了更新操作,注意左边事务没有提交,但此时右边再次执行查询的时候却读取到了左边未提交的数据,这就是我们说的脏读。
在读取未提交的隔离级别下,会出现脏读,不可重复读,幻读等等问题。那么如何解决这些问题呢,我们接着往下看
3、提交两边事务,此隔离级别演示结束
commit
3、读取已提交
1、设置隔离级别为读取已提交的
set session transaction isolation level read committed;
当我们将隔离级别设置成为读取已提交的级别时,我们发现,脏读问题解决了。左边事务没有提交,右边无法读取左边未提交的数据。
这个时候我们提交左边的事务。
我们发现左边事务一提交,右边再查询的时候就能够查到修改后的数据,但此时右边的事务还是一个事务,一个事务当中,执行同样的查询语句,查找到的结果却不一样,这就是不可重复读。
4、可重复读
设置隔离级别为可重复读。
set session transaction isolation level repeateable read;
将隔离级别上升为可重复读,我们发现,左边事务修改数据后并提交, 左边会查询到更新后的数据,右边事务不受影响,解决了不可重复读的问题
但可重复读这一隔离级别不能解决幻读问题
在左边的事务中我们删除了id=7的数据,提交事务,在右边查询的事务依然能够查询到id=7的这条数据,但此时我执行delete操作,删除id=7的数据是sql报错;
5、串行化
串行化没什么好说的,最高的隔离级别,解决了脏读,幻读,不可重复读