数据库笔记(1) —— 脏读、不可重复读、幻读

Posted by JX on October 1, 2017

数据库里面对数据进行并发处理的时候,如果不进行控制可能出现的三个现象:

脏读、不可重复读、幻读

脏读 Dirty Read

脏读,是指一个事务读取另外一个事务还没有提交的数据叫脏读。

具体来说就是在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。

不可重复读 Nonrepeatable Read

不可重复读是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。

这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

幻读 Phantom Read

所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务中又在该范围插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行Phanto row

例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。

小结

三种现象其实就是同一回事,事务T1读写数据时,事务T2在这期间对同样的数据集做了其他操作,导致事务T1出现各种问题。