暂无图片
Oracle中commit的响应时间会随着事务的大小而改变吗?
我来答
分享
北斗
2023-02-09
Oracle中commit的响应时间会随着事务的大小而改变吗?

Oracle中commit的响应时间会随着事务的大小而改变吗?

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新

通常情况下,commit是一个非常快的操作,其响应时间与事务大小无关。

为什么commit的响应时间不会随着事务的大小而改变呢?这是因为在数据库中执行commit之前,困难的工作都已经做了,执行了如下操作:

 · 已经在SGA中生成了undo;

 · 已经在SGA中生成了已修改数据块;

 · 已经在SGA中生成了对应前两项的redo缓存;

 · 如果前三项比较大并且耗时较长,那这三项中的某些数据可能已经被刷新输出到磁盘;

 · 已经得到了所需的全部锁。

执行commit时,只剩下如下的工作:

 · 为事务生成一个SCN(System Change Number,系统改变号)。

 · LGWR将所有未写入磁盘的重做日志条目写至磁盘,并把SCN记录到在线重做日志文件中。这一步就是真正的commit,如果提交过程都走到了这一步,事务的状态就是已提交。

 · V$LOCK中会记录着会话持有的锁,这些锁都将被释放,而排队等待这些锁的会话都会被唤醒,从而可以继续完成它们的工作。

 · 如果事务修改的某些块还在缓冲区缓存中,Oracle就会以一种快速的模式访问并“清理”。

可以看到,处理commit所要的工作很少,其中耗时最长的操作要算LGWR执行的活动,因为它会对物理磁盘读写。不过这里LGWR花费的时间并不会特别长,原因是LGWR一直不停地将重做日志缓冲区的内容刷到磁盘上去。

暂无图片 评论
暂无图片 有用 5
暂无图片
Thomas

请教一下,在COMMIT前,UNDO都存在内存中吗?那么何时这些内容存到UNDO TABLESPACE里呢?

暂无图片 评论
暂无图片 有用 0
2023-02-11
undo是存储在数据库内部一组特殊的段中,称为undo段。与数据库中的非undo数据类似,undo数据会写入到undo段,且也会被放到缓冲区缓存中。 commit前,undo数据有可能在磁盘上,也有可能还在缓冲区,因为LGWR在一直不停地将重做日志缓冲区的内容刷到磁盘上。
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏