原创

MySQL-事务的隔离级别-Isolation-脏读-不可重复读-幻读-读未提交-读已提交-可重复读-序化读

脏读:脏读是指某一个事务读取到了其他事务未提交的数据,如果此数据回滚,将导致读取到的数据是错误的数据。

不可重复读:指某个事务在开启后,读取某个范围或者某条数据时,在此事务未结束的时间里内,其他事务对表内的数据进行了添加,或者更改了某一条或者多条数据后进行了提交,此时本事务读取到的数据条数与之前某时间段读取到的条数不相同,或者在读取一条数据时,两个时间段内读取到的数据值不相同。

幻读:在一个事务开启后,其他事务对表中的一行或者多行进行了更改操作后进行了提交,本事务读取到的一行或多行的值仍和数量然是相同的,此时并不能读到其他事务在本事务查询时,提交的更改内容,即:其他事务对此表的更改本事务不能读到,这达成了可重复读的目的,但是读取到的数据是虚幻的。如果其他事物在此之间真实的更改了数据,则在本事务提交之前的读操作,读取到的都是未被更改前的数据,造成了读取的数据是虚幻的。

前提 同时开启了A,B两个事务但还都未开始操作数据

1.Read uncommitted (读未提交)
B事务未提交的数据 A事务可以读取到其修改的值。在B事务开启后,对一行进行了修改,但是未进行提交,此时A事务可以读取到此行 B事务未提交的数据,这发生了脏读现象,A事务也会发生 【不可重复读】现象,即多次读取同一行或多行,得到的数量或值不相同,和【幻读】现象,即A事务之前读取到的数据被修改后,此条之前读取的数据不是真实的数据是虚幻的,这与脏读是不相同的情况下读取数据所发生的的不相同的现象,区别是一个已经被提交一个可能会回滚。

2.Read committed(读已提交)
A事务在开启后,只能读取到已经被提交的数据,未被提交的数据,或者B事务中正在修改但未提交的数据,A事务读取不到。但是A事务在结束之前再次读取此表时,如果B事务对表中的条数或者某行数据进行了修改,A再次读取时会发生两次读取到的值或者行数不相同,此时发生了【不可重复读】的现象,且在B提交之前所读取到的值是脏数据,又发生了【脏读】现象。

3.Repeatable read(可重复读)
A事务开启后,无论在任何时间,任何次数读取一条或者多条数据得到的结果都是相同的。在A事务未结束前,B事务对表中的数据和条数进行修改后,A事务读取到的数据仍然是A 事务开启前最后一次事务提交后表中数据的状态,直到A事务结束后再次读取时才能得到被B事务修改的数据,这样避免了【脏读】【不可重复读】的问题,但是会产生新的问题:【幻读】,即B事务在A事务中读取数据时修改了表中的数据,A事务并不能读到修改内容,在此之间A事务读到的数据都是虚幻的。

4.Serializable (序化读)
指A事务和B事务不能同时执行,必须排队依次执行,如果A事务先被开启,则B事务不能做任何操作且包括读操作,此时事务间不会有任何交集,不会发生【脏读】【幻读】【不可重复】现象,每个事务中的操作都是安全的,但是会导致并发效率大大降低。

原文链接:https://blog.csdn.net/qq_46489900/article/details/122150056
正文到此结束
本文目录