Java教程

事务的隔离级别

本文主要是介绍事务的隔离级别,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

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

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

前提 同时开启了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事务不能做任何操作且包括读操作,此时事务间不会有任何交集,不会发生【脏读】【幻读】【不可重复】现象,每个事务中的操作都是安全的,但是会导致并发效率大大降低。

这篇关于事务的隔离级别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!