赞
踩
首先我们应该先明确 Mysql的四种隔离级别和四种对应的现象
读提交和可重复读都是一种隔离级别,可重复读解决了读提交本身未解决的 关于同一事务多次读取同一记录不一致的问题
对比记忆:
在读提交中: 事务A第一次读取数据,事务B修改同一数据但并未提交,事务A第二次读取数据,此时事务A读取数据并没有变化,然后将事务B提交,事务A第三次读取数据,才能读到数据的修改。
在可重复读中: 事务A第一次读取数据,事务B修改同一数据但并未提交,事务A第二次读取数据,此时事务A读取到的数据仍是修改之前的结果,然后将事务B提交,事务A第三次读取数据,(区别来了!)此时事务A读取到的数据仍然没有变化。 就是说在事务A提交之前,即使事务B修改并提交了数据,事务A读取的结果也没有任何变化,所以才会可重复读;
说白话:
读提交在事务A提交之前,可以读到事务B修改并提交的数据
可重复读隔离级别下,事务A提交之前,无论事务B怎么修改怎么提交,读到的都是一样的数据。除非事务A也提交了,才会读到事务B作出的更改。
在明确前提定义之后,我们开始讨论;(具体不明白定义的朋友,我会将定义贴到文末)
首先最低的隔离级别是读未提交 该级别的开销小,并发量高,但是会带来我们所说的脏读现象 ——也就是事务A可以读取到事务B未提交的数据,也就是脏数据。
那么我们为了解决脏读 这一现象,出现了下一隔离级别读已提交 ——只能读到事务B提交之后的数据,在提交之前所做的修改,事务A是读不到的(不可见的)。
所以,在我们只能读到提交的数据之后,便出现了第三种现象,即在事务A开启后多次读取同一数据,在多次读取中间,事务B对数据进行了修改然后提交,提交之后事务A再读,导致事务A结束之前多次读取的数据不同,所谓的不可重复读(这个是现象)。
解决不可重复读这一现象,需要用到下一隔离级别 这个隔离级别叫做 可重复读。但是可重复读仍然会有遗留现象,即幻读——当事务A在读取某个范围内记录时,事务B在该范围内插入了新的记录。
最终,解决幻读就用到了串行化这一隔离级别,通过强制事务串行之行,避免幻读问题,他会在读取的每一行数据上加锁
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。