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一次交互一次,下面这种方法能较少交互次数,提高效率(对于插入操作效率提升更明显)。
参考资料: