`

oracle commit

阅读更多

http://blog.csdn.net/knowhow/archive/2008/01/13/2042266.aspx

 

那么,为什么COMMIT 的响应时间相当“平”,而不论事务大小呢?在数据库中执行COMMIT 之前,困难的工作都已经做了。我们已经修改了数据库中的数据,所以99.9% 的工作都已经完成。例如,已经发生了以下操作:

q          已经在SGA 中生成了undo 块。

q          已经在SGA 中生成了已修改数据块。

q          已经在SGA 中生成了对于前两项的缓存redo

q          取决于前三项的大小,以及这些工作花费的时间,前面的每个数据(或某些数据)可能已经刷新输出到磁盘。

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

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

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

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

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

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

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

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

前面我提高过,由于某种原因,我们用的是一个Java 程序而不是PL/SQL ,这个原因就是PL/SQL 提供了提交时优化(commit-time optimization )。我说过,LGWR 是一个同步调用,我们要等待它完成所有写操作。在Oracle  10g  Release 1 及以前版本中,除PL/SQL 以外的所有编程语言都是如此。PL/SQL 引擎不同,要认识到直到PL/SQL 例程完成之前,客户并不知道这个PL/SQL 例程中是否发生了COMMIT ,所以PL/SQL 引擎完成的是异步提交。它不会等待LGWR 完成;相反,PL/SQL 引擎会从COMMIT 调用立即返回。不过,等到PL/SQL 例程完成,我们从数据库返回客户时,PL/SQL 例程则要等待LGWR 完成所有尚未完成的COMMIT 。因此,如果在PL/SQL 中提交了100 次,然后返回客户,会发现由于存在这种优化,你只会等待LGWR 一次,而不是100 次。这是不是说可以在PL/SQL 中频繁地提交呢?这是一个很好或者不错的主意吗?不是,绝对不是,在PL/SQ; 中频繁地提交与在其他语言中这样做同样糟糕。指导原则是,应该在逻辑工作单元完成时才提交,而不要在此之前草率地提交。

注意        如果你在执行分布式事务或者以最大可能性模式执行Data GuardPL/SQL 中的这种提交时优化可能会被挂起。因为此时存在两个参与者,PL/SQL 必须等待提交确实完成后才能继续。

分享到:
评论

相关推荐

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

    1. COMMIT_FORM和COMMIT 都对form和数据库进行提交。针对form上面的数据变动提交到后台数据库,同时数据库提交数据。 2. DO_KEY(‘COMMIT_FORM’) 它会首先执行KEY-COMMIT触发器里面的代码,如果没有这个触发器,则...

    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-捕获提交过频语句SQL语句

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

    oracle恢复误删数据

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

    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日常维护故障定位故障排除

    17由于没有COMMIT,导致数据库表被锁住 18索引创建不合理,导致数据库查询特别慢 19 由于BUFFER参数设置不合理导致EXP失败 20由于EXP不向上兼容,语言不兼容,导致不同版本、不同字符集的数据库无法导入 21 由于创建...

    seata-oracle版undolog.sql

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

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

    因为你每删一条数据,oracle要自动执行一次commit。commit是需要资源的。所以如果你手动设置为每删数据1000条,执行一次commit. 那你可以节省资源了。  (2)充分利用batch update。如果不用batch,每个

    blackflagking#Notes-Databases#Oracle materialize view无法自动刷新问题1

    1.job_queue_processes取值范围为0到1000 2.当设定该值为0的时候则任意方式创建的job都不会运行 3.当设定该值大于1时,且并行执行j

    Oracle服务进程如何处理用户进程的请求.doc

    Oracle服务器进程在完成用户进程的请求过程中,主要完成如下7个任务:0.sql语句的解析;1.数据块的读入db buffer(写入数据缓存);2.记日志;3.为事务建立回滚段;4.本事务修改数据块;5.放入dirty list;6.用户...

    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的sql优化

     对于复杂的存储过程可以多次提交的数据的要多分多次Commit,否则长事务对系统性能影响很大  Distinct和Having子句都是耗时操作,应该尽可能少使用  在不需要考虑重复记录合并时候用Union All来代替Union  使用...

    ORACLE误删除数据的恢复方法

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

Global site tag (gtag.js) - Google Analytics