实例失败后,未提交的事务是要用undo来回滚的,回滚的数据来自撤销段,撤销段来自谁?
在网上查了一下,
第一种说法:撤销数据放在撤销段中,撤销段中标记这个事务将仍为激活状态,在数据库重新启动过程中,后台进程SMON会扫描undo segment header,将发现上面的执行语句还是处于激活状态,于是, 将这些未提交的活动事务标志为dead。数据库后,后台进程SMON发现dead事务,根据情况去逐步回滚。
第二种说法:利用redo中写入的undo数据进行回滚?哪一个正确?
在网上查了一下,
第一种说法:撤销数据放在撤销段中,撤销段中标记这个事务将仍为激活状态,在数据库重新启动过程中,后台进程SMON会扫描undo segment header,将发现上面的执行语句还是处于激活状态,于是, 将这些未提交的活动事务标志为dead。数据库后,后台进程SMON发现dead事务,根据情况去逐步回滚。
第二种说法:利用redo中写入的undo数据进行回滚?哪一个正确?
至于你说的原理,我个人觉得都对,我上面一段话就是你说的第二种说法,第一种说法是跟深层的解释,我在上文中说了一句“如果不够,还有undo表空间里的undo块也调进来”那具体怎么调进来呢?就是你说的,将那些undo块对应的事务标记为dead,然后再去回滚这个事务