脏读幻读不可重复读
哪个大佬说一下为什么没提交的数据可以被读到?
哪个大佬说一下为什么没提交的数据可以被读到?
2017-05-24
一个事务读到另一个事务,尚未提交的修改,就是脏读。这里所谓的修改,除了Update操作,不要忘了,还包括
Insert和Delete操作。
举个例子:预订房间。
有一张Reservation表,往表中插入一条记录,来订购一个房间。
事务1:在Reservation表中插入一条记录,用于预订99号房间。
事务2:查询,尚未被预定的房间列表,因为99号房间,已经被事务1预订。所以不在列表中。
事务1:信用卡付款。由于付款失败,导致整个事务回滚。
所以插入到Reservation 表中的记录并不置为持久(即它将被删除)
而事务2刚刚读取时显示99号房间不在列表中,即99号房间不可用,已经被预定。但是由于事务回滚现在99号房间则为可用。这就是脏读。
由于数据库的多版本性(不是版本号)和并发性,你可以理解成缓存区(就是在数据没提交之前的临时存放区域),另外一个事务可能在缓存区读取到这些已作出修改但未提交的数据,就出现了脏读。
举报