Oracle中redolog和undolog
transaction:事务
⼀个事务会在数据库中申请资源来完成任务,事务或复杂或简单,最后都只有两个结果,事务成功或者失败,成功需要保存事务更改,失败需要恢复到事务前的状态
redo log:重做⽇志
在操作⼀条数据之前需要记录redo log,然后再修改数据,以便在数据库出现问题的时候通过redo log恢复已经提交的数据。redo log是为了重现已经做过的操作
undo log:撤销⽇志
为了保证读⼀致性,在更新数据到提交之前,Oracle会先把旧数据写⼊到undo log中,以便回滚,且其他⽤户读取的数据也是和undo log中的数据⼀致,直到提交事务才更改数据,undo log是为了撤销所作更改。数据放在undo表空间中
不管是redo log和undo log都是记录在内存中的,只要断电数据就会丢失,⼀般数据库会有相应机制把内存数据写道磁盘上,⽐如⼏秒钟写⼀次,数据⽂件⼤于1M写⼀次,需要注意的是Oracle会先写redo log,因为redo log记录了整个事务完整的操作轨迹,可以⽤来做数据恢复
对于Oracle的基本操作,都会写相关的⽇志,以便做数据恢复。对于undo来说,undo log是写到undo表空间中,事务没提交以前,这些undo segment是active的,不能被别的undo数据覆盖,事务提交以后才能被别的undo覆盖,所以如果执⾏⼀个很⼤的更新或者删除事务,就会造成undo不够⽤,⼀个解决办法是加⼤undo表空间,还有⼀个办法就是把⼤事务拆分成⼩事务,⽐如分批提交。
Oracle分批提交DML
假设有两个表test1和test2,两个表都有⼀个ID字段(Primary Key),test1和test2都还有⼀个字段cname
上图中是把需要更新的数据放到游标中⼀⾏⼀⾏更新,通过计数器实现更新10000⾏提交⼀次,但是这种写法pl/sql引擎会频繁与数据库交互,update⼀次交互⼀次,下⾯这种⽅法能较少交互次数,提⾼效率(对于插⼊操作效率提升更明显)。
参考资料:
oracle redo回滚段详解、Oracle数据库之FORALL与BULK COLLECT语句提交更改是内存条吗

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。