当一个事务提交时,the log writer (LGWR) process 负责将事务相关的所有重做从log buffer写出到Online Redo logfiles.默认的,Oracle数据库必须将重做写入磁盘才把控制权交还给客户端,这种行为导致在Commit的时候有一定的延时因为应用程序必 须等待重做被写入磁盘。
在Oracle10gR2中我们可以改变commit的默认行为来实 现在commit之后,控制权立刻返回给用户,而不是等待LGWR将重做写入到online redo logfile.
在这样的情况下,导致的潜在的风险是当实例Crash或是写入online redo logfile失败之后,那些被缓冲在redo log buffers中且还未被写入到online redo logfile中的已经提交事务的redo可能会丢失,会导致那些已经提交的事务不能被恢复。
如 何使用Asynchronous COMMIT
你可以在以下的两个位置来改变Commit的默认行为:
1:在System or Session Level改变COMMIT_WRITE初始化参数
COMMIT_WRITE = '{IMMEDIATE | BATCH},{WAIT |NOWAIT}'
COMMIT_WRITE初始化参数选项可能 的组合:
IMMEDIATE, WAIT
IMMEDIATE, NOWAIT
BATCH, WAIT
BATCH, NOWAIT
IMMEDIATE选项确保在发出Commit命令之后redo被立即写出,也 就是说,发起一次I/O。
BATCH选项意味着redo首先被缓冲,并没有发起I/O,LGWR在适当的时间发起I/O批量将redo写入磁盘。
WAIT 选项确保在redo没有写入Online redo logfile前不会将控制权返回,而必须等待。
NOWAIT选项指定发出Commit命令 之后立即将控制权返回,而不用等待redo写入磁盘。
当没有任何选定指定时,默认是 IMMEDIATE , WAIT,这同之前的数据库版本是一样的。
不能同时指定BATCH 和 IMMEDIATE,也不能同时指定WAIT 和 NOWAIT。
在初始化参数设置之后,不带任何选项的Commit语句遵照初始化参数指定的选项。
eg:
ALTER SYSTEM SET COMMIT_WRITE = IMMEDIATE, WAIT
ALTER SESSION SET COMMIT_WRITE = IMMEDIATE, NOWAIT
2:COMMIT语句中
COMMIT [WRITE [IMMEDIATE | BATCH] [WAIT | NOWAIT] ]
eg:
COMMIT WRITE BATCH WAIT
COMMIT WRITE BATCH NOWAIT
Note:
Note: The options in the COMMIT statement override the current settings in the initialization parameter.