实验前做的事情:关闭自动提交
开启两个命令行窗口,在两个命令行串口执行以下命令
select @@autocommit; //查看是否开启自动提交(默认是1,开启)
set @@autocommit = 0; //关闭自动提交
一、读未提交(产生脏读)
在两个命令行都执行以下命令:
可以看到,当左边窗口修改数据但还没提交的时候,右边窗口就已经可以读到未提交的数据了,这种读到未提交的数据就是脏读
二、读已提交(不可重复读)
当隔离级别为read Commited时,左边窗口修改数据没提交之前,右边窗口的数据不会改变;当左边窗口数据提交之后,右边窗口读数据时才会发生改变。
此时,右边的事务并没有结束,并且也没做任何修改,但读取到的数据发生了变化,这种现象就是不可重复读。我觉得就是重复读取数据时,数据不一致,所以不能重复读取。所以叫不可重复读
三、可重复读(幻读)
当隔离级别为repeatable read时,左边窗口修改数据并且提交之后,右边读取到的数据依然保持不变。此时,右边的数据可以重复读取,不会产生改变(除非右边窗口的事务自己修改数据)。
当在右边窗口执行左边窗口同样的命令时,会报错,应该都能看懂是什么错。。。问题来了:右边窗口读取到的数据没有id=1的,但是却不能插入数据,其实id=1的数据已经存在了,只不过是右边窗口读取不到,这就是幻读。