`
444878909
  • 浏览: 640953 次
文章分类
社区版块
存档分类
最新评论

oracle commit 做了什么?

 
阅读更多

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

  执行COMMIT时,余下的工作只是:

  为事务生成一个SCN。如果你还不熟悉SCN,起码要知道,SCN是Oracle使用的一种简单的计时机制,用于保证事务的顺序,并支持失败恢复。SCN 还用于保证数据库中的读一致性和检查点。可以把SCN看作一个钟摆,每次有人COMMIT时,SCN都会增1.

  LGWR将所有余下的缓存重做日志条目写到磁盘,并把SCN记录到在线重做日志文件中。这一步就是真正的COMMIT。如果出现了这一步,即已经提交。事务条目会从V$TRANSACTION中“删除”,这说明我们已经提交。

  V$LOCK中记录这我们的会话持有的锁,这些所都将被释放,而排队等待这些锁的每一个人都会被唤醒,可以继续完成他们的工作。

  如果事务修改的某些块还在缓冲区缓存中,则会以一种快速的模式访问并“清理”。块清除(Block cleanout)是指清除存储在数据库块首部的与锁相关的信息。实质上讲,我们在清除块上的事务信息,这样下一个访问这个块的人就不用再这么做了。我们采用一种无需生成重做日志信息的方式来完成块清除,这样可以省去以后的大量工作(在下面的“块清除”一节中将更全面地讨论这个问题)。

  可以看到,处理COMMIT所要做的工作很少。其中耗时最长的操作要算LGWR执行的活动(一般是这样),因为这些磁盘写是物理磁盘I/O。不过,这里LGWR花费的时间并不会太多,之所以能大幅减少这个操作的时间,原因是LGWR一直在以连续的方式刷新输出重做日志缓冲区的内容。在你工作期间,LGWR并非缓存这你做的所有工作;实际上,随着你的工作的进行,LGWR会在后台增量式地刷新输出重做日志缓冲区的内容。这样做是为了避免COMMIT等待很长时间来一次性刷新输出所有的redo。

  因此,即使我们有一个长时间运行的事务,但在提交之前,它生成的许多缓存重做日志已经刷新输出到磁盘了(而不是全部等到提交时才刷新输出)。这也有不好的一面,COMMIT时,我们必须等待,直到尚未写出的所有缓存redo都已经安全写到磁盘上才行。也就是说,对LGWR的调用是一个同步(synchronous)调用。尽管LGWR本身可以使用异步I/O并行地写至日志文件,但是我们的事务会一直等待LGWR完成所有写操作,并收到数据都已在磁盘上的确认才会返回。

分享到:
评论

相关推荐

    Oracle Form中COMMIT的概述及使用技巧

    DO_KEY(‘COMMIT_FORM’) 它会首先执行KEY-COMMIT触发器里面的代码,如果没有这个触发器,则会做COMMIT_FORM一样的操作。 3. FORMS_DLL(‘COMMIT’) 只针对代码中insert、update、delete语句进行提交,form上面的...

    oracle执行update语句时卡住问题分析及解决办法

    这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...

    oracle Session与lock 解除

    ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁 3:Row-X 行专用(RX):用于行的修改 4:Share 共享锁(S):阻止其他DML操作 5:S/Row-X 共享行专用(SRX):阻止其他...

    ORACLE INSERT INTO SELECT *FROM 分批提交例子

    ORACLE INSERT INTO SELECT *FROM 分批提交例子

    oracle 常用语句 oracle备份 oracle冷备份 oracle启停 oracle导出 oracle导入

    COMMIT 指定是否在每个数组(其大小由BUFFER参数设置)插入后进行提交 ..................(见附件) --导入 --整个文件导入 ..................(见附件) --物理备份 冷备份 ..................(见附件) 冷...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    9.4.1 COMMIT做什么? 289 9.4.2 ROLLBACK做什么? 296 9.5 分析redo 297 9.5.1 测量redo 298 9.5.2 redo生成和BEFORE/AFTER触发器 300 9.5.3 我能关掉重做日志生成吗? 306 9.5.4 为什么不能分配一个新日志? ...

    oracle-捕获提交过频语句SQL语句

    捕获oracle中提交过频语句SQL语句,快速定位问题sql。

    oracle恢复误删数据

    oracle中数据delete且commit 恢复误删数据

    用JDBC访问ORACLE数据库 关于commit 增快效率 大数据 等的整理

    1、问:用JDBC访问ORACLE数据库,做DELETE操作,能用JAVA多线程实现吗? ORACLE服务器要怎么配?(以下答案来自网络,仅供参考)  答: Oracle有自己的锁机制。算你开100条线,它还是一条一条删除。不能同时删除多...

    Oracle基于日志的数据备份

    CDC(Change Data Capture)是oracle在数据库级别实现的增量抽取解决...而异步CDC则是通过分析已经commit的日志记录来得到增量数据信息,有一定的时间延迟,并且提供了到Oracle Streams的接口。异步CDC只在10g中支持。

    最全的oracle常用命令大全.txt

    ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup ...

    shell连接oracle数据库执行SQL工具脚本-支持select+inset+update

    shell连接oracle数据库工具脚本:支持select/insert/update/delete 部署位置:/root/sysmonitor db:数据库文件夹 dbconfig.properties:数据库配置文件, dbConnectTest.sh:连接测试文件 dbExecurteSQL.sh:...

    Oracle日常维护故障定位故障排除

    6由于未对特大表(达到或超过100万条记录)定期做表分析导致数据库操作特别慢 7由于空间不够导致插入数据时扩展索引失败 8由于REDOLOG破坏导致数据库异常 9由于控制文件被破坏导致数据库无法正常启动 10由于数据文件...

    深入解析Oracle.DBA入门进阶与诊断案例

    7.10 commit做了什么? 317 7.11 日志的状态 318 7.12 日志的块大小 321 7.13 日志文件的大小 322 7.14 如何调整日志文件大小 324 7.15 为什么热备份期间产生的Redo要比正常的多 326 7.16 能否不生成...

    Oracle 19c OCP 082 试题带翻译-2022.5.2更新

    Which two statements are true about space - saving features in an Oracle Database? A.An index created with the UNUSABLE attribute has no segment. B.Private Temporary Tables(PTTs)store metadata in ...

    ORACLE9i_优化设计与系统调整

    §1.4.2 COMMIT语句处理顺序 32 §1.5 共享池 33 §1.6 块缓存(数据高速缓冲区) 33 §1.7 数据库写入进程 34 §1.8 日志写进程 34 §1.9 数据库检查点 34 §1.10 归档处理 35 §1.11 程序全局区(PGA) 35 第2章 ...

    ORACLE误删除数据的恢复方法

    有很多原因导致了数据记录的误删,怎样恢复误删的记录呢?先来看看这个概念: SCN(系统改变号),它的英文全拼为:System...一些人认为 SCN 是指, System Commit Number ,而通常 SCN 在提交时才变化,所以很多情况下,

    seata-oracle版undolog.sql

    oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...

Global site tag (gtag.js) - Google Analytics