mysql数据库有四种隔离级别,分别是读未提交、读已提交,可重复读,串行化,mysql默认的隔离级别是可重复读。
读未提交会出现脏读,不可重复读和幻读的问题,读已提交会出现不可重复读和幻读的问题,可重复读会出现幻读的
问题,可串行化可不会出现以上三种问题。虽然随着隔离级别的提高,出现的问题会变得很少,但是事务的并发度也
会降低。下面对四种隔离级别进行演示。
1.读未提交
powershell和cmd两个窗口扮演两个访问数据库的角色,并将隔离级别设置为读未提交
查看需要改动数据表的原本的数据如下:
在两个终端中分别开启事务,在powershell中修改test表中的一个数据,但是不提交事务,通过cmd开启事务并查看test表中数据是否发生变化,如下
可以看到在powershell没有提交事务的情况下,cmd去查询发现数据已经变化,此时如果powershell回滚事务,再观察cmd中test数据会怎样
从上面的数据可以得出结论:在读未提交这种隔离级别下,事务A可以读到事务B没有提交的事务,如果事务B回滚,事务A再在去查看数据就会发现数据和刚才查到的数据不一样,这就是“脏读”的问题,为了解决脏读问题,将数据库隔离级别设置为读已提交
2.读已提交
在powershell中开启事务并修改test数据表中的值,但是不提交事务,在cmd中开启事务并查询数据观察和读未提交有什么区别
此时可以看到虽然powershell修改了数据表,但是没有提交,cmd得到的还是之前未修改的数据,我们在将powershell事务提交,通过cmd查看
可以看到当powershell将事务提交后,cmd读取到的数据就是修改过得了,这就是读已提交,一个事务只能读到另一个事务已经提交了的更改,无法读取到未提交的更改。
在这种隔离级别下cmd在事务里两次读取到的事务前一次后一次读到的数据不一样且后续在也无法读到之前的数据,这种情况称作“不可重复读”,为了解决这一问题,可以将隔离级别设置为可重复读,这也是mysql默认的隔离级别。
3.可重复读
老方法,在powershell中开启事务并修改test中的值,提交事务,观察在cmd开启事务获取数据观察发生了怎样的变化
可以看到powershell更改了数据并已经提交了事务,但在cmd事务中查询数据发现数据并没有修改,也就是说在可重复读的隔离模式下,即便事务A修改了数据并提交了,事务B读到的数据只是该事务开启时的数据状态,如果事务B提交之后再去查询数据,结果就是更改过的数据了,从下图可以看出。
4.串行化
从上图可以看出,两个事务同时开启,powershell开始更新了test表,但是未提交,此时去执行cmd事务的查询语句,直接被锁死,不让cmd事务执行,图中的结果是事务等待超时,如果将powershell的事务及时提交,cmd的事务就可以及时执行,虽然这种隔离级别解决了上述出现的问题,但是在生产过程中一般不会去使用这种隔离级别。