描述undo的三个作用

1rollback

  1、一个事务开始,生成一个事务id(找事务counter

  2、读取系统事务表,找到一个回滚段(找相对空闲的),读取回滚段的段头块(段头里面有很多行,找到其中空闲的行,把事务id写进去,写进去之后一个事务就开始了,一个事务槽盛放一个事务id,也就是说一个事务开始了需要找到事务槽把事务id写进去)和一些回滚页(事务数据块)(我要修改一个数据行, 在数据行里需要把事务id写进去,在后面找一个undo块盛放修改前的数据),rollpointer(回滚指针)指向盛放旧数据的最后一个undo块,最后一个块指向前一个块,都链起来。当回滚的时候,先找到最后一个undo块,依次往前逆着读,把脏数据块还原成原来的数据块。

2、写不阻塞读

  采用的是数据行的rollpointer指针,结合undo数据,读取数据修改前的值,构造一致性读,避免脏读。

  能够避免脏读,就不需要采用写阻塞读的方式来避免脏读。

3、崩溃恢复(redo前滚,undo回滚。未提交事务主动回滚,未提交事务信息在事务槽里写着)

  数据库在运行期间,突然崩了,数据库启动之后,需要redo前滚,就会有很多未提交的事务也滚回来了,系统中存在很多未提交的事务,并且这些事务的会话断了,不可能继续完成了,就需要对未提交事务回滚了,所有的未提交事务的信息都在事务槽里面存着,读取事务槽,把未提交事务回滚。

猜你喜欢

转载自www.cnblogs.com/5945yang/p/11265866.html