脏读:脏读是指某一个事务读取到了其他事务未提交的数据,如果此数据回滚,将导致读取到的数据是错误的数据。
不可重复读 指某个事务在开启后,读取某个范围或者某条数据时,在此事务未结束的时间里内,其他事务对表内的数据进行了添加或者更改了某一条或者多条数据,此时本事务读取到的数据条数与之前某时间段读取到的条数不相同,或者在读取一条数据时两个时间段内读取到的数据值不相同。
幻读 在一个事务开启后,其他事务对表中的一行或者多行进行了更改操作后,本事务读取到的一行或多行的值仍和数量然是相同的,此时并不能读到其他事务更改的内容,其他事务对此表的更改本事务不能读到,这达成了可重复读的目的,但是读取到的数据是虚幻的。如果其他事物在此之间真实的更改了数据,则在本事务提交之前的读操作,读取到的都是未被更改前的数据,造成了读取的数据是虚幻的。
前提 同时开启了A,B两个事务
B事务未提交的数据 A事务可以读取到其修改的值。在B事务开启后,对一行进行了修改,但是未进行提交,此时A事务可以读取到此行 B事务未提交的数据,这发生了脏读想象,A事务也会发生 【不可重复读】现象,即多次读取同一行得到的结果不相同,和【幻读】现象,即A事务之前读取到的数据被修改改后,此条数据不是真实的数据是虚幻的,这与脏读是不相同的情况下读取数据所发生的的不相同的现象,区别是一个已经被提交一个可能会回滚。
A事务在开启后,只能读取到已经被提交的数据,未被提交的数据或者B事务中正在修改的数据但为提交的数据,A事务读取不到。但是A事务在结束之前再次读取此表时,如果B事务对表中的条数或者数据进行了修改,A在此读取时会发生两次读取到的值或者行数不相同,此时发生了【不可重复读】的现象,且在B提交之前所读取到的值是脏数据,又发生了【脏读】现象。
A事务开启后,无论在任何时间,任何次数读取一条或者多条数据得到的结果都是相同的。在A事务未结束前,B事务对表中的数据和条数进行修改后,A事务读取到的数据仍然是A 事务开启前最后一次事务提交后表中数据的状态,直到A事务结束后再次读取时才能得到被B事务修改的数据,这样避免了【脏读】【不可重复读】的问题,但是会产生新的问题:【幻读】,即B事务在A事务中读取数据时修改了表中的数据,A事务并不能读到修改内容,在此之间A事务读到的数据都是虚幻的。
指A事务和B事务不能同时执行,必须排队依次执行,如果A事务先被开启,则B事务不能做任何操作且包括读操作,此时事务间不会有任何交集,不会发生【脏读】【幻读】【不可重复】现象,每个事务中的操作都是安全的,但是会导致并发效率大大降低。