Oracle事务

【1.事务隔离】 ①一个未提交的事务所作的修改不能被其它事务所看到。只有当事务提交成功后,在该事务以后执行的其它事务才可能看到该事务所作的改变。 ②在该事务提交以前已经执行了一部分而另外一部分在该事务提交后执行的剩余部分一样也看不到该事务作出的改变。这是另外一个Oracle特性:读一致和快照。 ③在该事务提交同时进行的其它事务一样也看不到该事务所作的改变。 【2.语句级回滚】 ①当一个SQL语句在执行期间由于发生的任何错误而中断时,将产生一个“语句级回滚”。该回滚的后果就像这个SQL语句根本没有执行过同样。 ②注意回滚是发生在“执行”阶段的,若是是在SQL语句的解析阶段由于语法问题而没法执行。由于没有产生任何影响而不会出现“回滚”。 【3.事务控制的分割】 若是一个事务中包含了DML语句和DDL语句,那么该事务会被分解成多个事务。首先在DDL以前的全部DML语句会被做为一个事务而一次性提交。而后Oracle会为这个DDL建立一个新的,单语句的事务。若是DDL语句执行失败了,那么DML事务依然成功。 【4.不一样状况下的事务控制】 请注意:用户从Oracle服务器断开链接和用户进程强行中断的后果是不一样的。 ①前者典型的例子是Oracle服务器关闭或重启,此时全部未提交事务会被提交。 ②后者典型的例子用户经过进程管理器强行kill掉进程,此时全部未提交事务所作的操做被回滚。 【5.事务提交前要作的事情】 Oracle提交一个事务以前,必须作如下几件事情: ①记住数据被修改前是什么样子的 ②记住数据即将要被改为什么样子 ③记住redo log和undo log的关联 ④将SGA中已读取到内存的数据修改成新的值(此时并未真正保存到数据文件) 其中第一步是经过在undo表空间中记录undo日志来完成的。第二步、第三步是经过向SGA中的redo日志缓冲区写记录来完成的。这样当事务回滚时就能够从redo日志找到对应的undo日志,从而找回以前的数据 ★要特别注意的是:此时不必定会触发DBWn进程。 ★要特别注意的另外一个地方是:第2步记录事务操做的改变是内存中进行的,还未写到磁盘上的redo日志文件 【6.事务提交时所作的事情】 ①记录SCN值(System Change Number) ②将在线重作日志记录(位于SGA的redo日志缓冲区中)持久化到redo日志文件 ③Oracle释放资源和锁 ④Oracle将事务标记为已结束 注意:只有在commit指令被发出后,才会将SGA中重作日志缓冲区的内容刷新到磁盘的redo日志文件。在LGWR进程执行前,重作日志一直存在于内存中,也被称为在线重作日志。 【7.savepoint回滚和整个事务的回滚】 注意当Oracle事务回滚到某个savepoint时,在savepoint以后的全部后续savepoint将失效。但此时Transaction仍是活跃且可继续的。这一点不一样于整个事务的回滚。 【8.自治事务】 从传统上来讲,一个事务只有在完整执行成功或回滚以后,才会进行下一个事务。而自治事务容许在一个事务中调用运行另外一个事务,被调用事务执行完成后,调用事务继续执行以前未完成的操做直至事务结束 自治事务在被调用后,将和外围事务彻底独立。彼此之间并不共享任何资源或者锁,外围事务全部未提交的改变对自治事务来讲都是不可见。自治事务提交后外围事务将能够看到改变
相关文章
相关标签/搜索