undo
回退段中的数据是以“回退条目”方式存储。
回退条目=块信息(在事务中发生改动的块的编号)+在事务提交前存储在块中的数据
在每一个回退段中oracle都为其维护一张“事务表”
在事务表中记录着与该回退段中所有回退条目相关的事务编号(事务SCN&回退条目)
redo
重做记录由一组“变更向量”组成。
每个变更变量中记录了事务对数据库中某个块所做的修改。
当用户提交一条commit语句时,LGWR进程会立刻将一条提交记录写入到重做日志文件中,然后再开始写入与该事务相关的重做信息。
#事务提交成功后,Oracle将为该事备生成一个系统变更码(SCN)。事务的SCN将同时记录在它的提交记录和重做记录中。
commit
提交事务前完成的工作:
·在SGA区的回退缓存中生成该事务的回退条目。在回退条目中保存有该事务所修改的数据的原始版本。
·在SGA区的重做日志缓存中生成该事务的重做记录。重做记录中记载了该事务对数据块所进行的修改,并且还记载了对回退段中的数据块所进行的修改。缓存中的重做记录有可能在事务提交之前就写入硬盘中。
·在SGA区的数据库缓丰中记录了事务对数据库所进行的修改。这些修改也有可能在事务提交之前就写入硬盘中。
提交事务时完成的工作:
·在为该事务指定的回退段中的内部事务表内记录下这个事务已经被提交,并且生成一个惟一的SCN记录在内部事务表中,用于惟一标识这个事务。
·LGWR后进进程将SGA区重做日志缓存中的重做记录写入联机重做日志文件。在写入重做日志的同时还将写入该事务的SCN。
·Oracle服务进程释放事务所使用的所有记录锁与表锁。
·Oracle通知用户事务提交完成。
·Oracle将该事务标记为已完成。
rollback
回退事务完成的工作:
·Oracle通过使用回退段中的回退条目,撤销事务中所有SQL语句对数据库所做的修改。
·Oracle服务进程释放事务所使用的所有锁
·Oracle通知事务回退成功。
·Oracle将该事务标记为已完成问题是:当触发redo写的几个条件(1.每3秒超时 2.阀值达到 3.用户提交 4.在DBWN写之前)重做日志缓存中的重做记录有可能在事务提交之前就写入硬盘中。
问题:当某个事务还未提交,此时出发了redo写条件,是否会把未提交的事务写入到redofile文件中.
如果发了redo写条件,把未提交的事务写入到了redofile文件中,刷新了redobuffer后,当用户提交了那个未提交就因redo写条件写入redofile文件中的事务,orale通过什么方式来更新,那个因redo写条件写入redofile文件中的那个未提交的事务?
希望能有高手解答.
回退段中的数据是以“回退条目”方式存储。
回退条目=块信息(在事务中发生改动的块的编号)+在事务提交前存储在块中的数据
在每一个回退段中oracle都为其维护一张“事务表”
在事务表中记录着与该回退段中所有回退条目相关的事务编号(事务SCN&回退条目)
redo
重做记录由一组“变更向量”组成。
每个变更变量中记录了事务对数据库中某个块所做的修改。
当用户提交一条commit语句时,LGWR进程会立刻将一条提交记录写入到重做日志文件中,然后再开始写入与该事务相关的重做信息。
#事务提交成功后,Oracle将为该事备生成一个系统变更码(SCN)。事务的SCN将同时记录在它的提交记录和重做记录中。
commit
提交事务前完成的工作:
·在SGA区的回退缓存中生成该事务的回退条目。在回退条目中保存有该事务所修改的数据的原始版本。
·在SGA区的重做日志缓存中生成该事务的重做记录。重做记录中记载了该事务对数据块所进行的修改,并且还记载了对回退段中的数据块所进行的修改。缓存中的重做记录有可能在事务提交之前就写入硬盘中。
·在SGA区的数据库缓丰中记录了事务对数据库所进行的修改。这些修改也有可能在事务提交之前就写入硬盘中。
提交事务时完成的工作:
·在为该事务指定的回退段中的内部事务表内记录下这个事务已经被提交,并且生成一个惟一的SCN记录在内部事务表中,用于惟一标识这个事务。
·LGWR后进进程将SGA区重做日志缓存中的重做记录写入联机重做日志文件。在写入重做日志的同时还将写入该事务的SCN。
·Oracle服务进程释放事务所使用的所有记录锁与表锁。
·Oracle通知用户事务提交完成。
·Oracle将该事务标记为已完成。
rollback
回退事务完成的工作:
·Oracle通过使用回退段中的回退条目,撤销事务中所有SQL语句对数据库所做的修改。
·Oracle服务进程释放事务所使用的所有锁
·Oracle通知事务回退成功。
·Oracle将该事务标记为已完成问题是:当触发redo写的几个条件(1.每3秒超时 2.阀值达到 3.用户提交 4.在DBWN写之前)重做日志缓存中的重做记录有可能在事务提交之前就写入硬盘中。
问题:当某个事务还未提交,此时出发了redo写条件,是否会把未提交的事务写入到redofile文件中.
如果发了redo写条件,把未提交的事务写入到了redofile文件中,刷新了redobuffer后,当用户提交了那个未提交就因redo写条件写入redofile文件中的事务,orale通过什么方式来更新,那个因redo写条件写入redofile文件中的那个未提交的事务?
希望能有高手解答.
你说的这个问题的解决方法就是更新数据块头的提交scn,就是用到块清除”和“延迟块清除
楼主最近都在学一些原理性的东西呀给你个建议哦 下次发帖直接说明问题就够了 不要贴一大段内容上来 不然大家不容易抓到重点当某个事务还未提交,此时出发了redo写条件,是否会把未提交的事务写入到redofile文件中.
会的。如果发了redo写条件,把未提交的事务写入到了redofile文件中,刷新了redobuffer后,当用户提交了那个未提交就因redo写条件写入redofile文件中的事务,orale通过什么方式来更新,那个因redo写条件写入redofile文件中的那个未提交的事务?
没太明白你想问什么
ORACLE通过什么方式更新什么?
会,只要是有data block被修改就会,准确来说redo是以block为单位记录重做条目的。如果发了redo写条件,把未提交的事务写入到了redofile文件中,刷新了redobuffer后,当用户提交了那个未提交就因redo写条件写入redofile文件中的事务,orale通过什么方式来更新,那个因redo写条件写入redofile文件中的那个未提交的事务?
redo和事务是两个概念,事务不是redo来控制的 关于redo和undo建立里看看这个文章。
http://blog.csdn.net/inthirties/archive/2009/11/20/4843831.aspx