问答详情
源自:3-3 TransactionDefinition定义事务隔离级别

脏读幻读不可重复读

哪个大佬说一下为什么没提交的数据可以被读到?

提问者:慕粉4389653 2017-05-24 15:21

个回答

  • 全栈小学生
    2017-07-28 20:12:09

    数据在进行完操作但没有进行提交时,他是存在日志当中的,只有提交之后,才会从日志中存到数据库中

  • 梦纯粹4055143
    2017-05-24 19:01:35

        一个事务读到另一个事务,尚未提交的修改,就是脏读。这里所谓的修改,除了Update操作,不要忘了,还包括
    Insert和Delete操作。

    举个例子:预订房间。
    有一张Reservation表,往表中插入一条记录,来订购一个房间。

     事务1:在Reservation表中插入一条记录,用于预订99号房间。

     事务2:查询,尚未被预定的房间列表,因为99号房间,已经被事务1预订。所以不在列表中。

     事务1:信用卡付款。由于付款失败,导致整个事务回滚。
                所以插入到Reservation 表中的记录并不置为持久(即它将被删除)

           而事务2刚刚读取时显示99号房间不在列表中,即99号房间不可用,已经被预定。但是由于事务回滚现在99号房间则为可用。这就是脏读。

            由于数据库的多版本性(不是版本号)和并发性,你可以理解成缓存区(是在数据没提交之前的临时存放区域),另外一个事务可能在缓存区读取到这些已作出修改但未提交的数据,就出现了脏读。