今天看了tom大师关于sql restart的博客,收益颇深。鉴于的繁琐和以后查阅的方便,将主要内容总结至此。大家也可以通过如下地址查看原博文及精彩点评(需要哦)。
http://tkyte.blogspot.com/2005/08/something-different-part-i-of-iii.html
http://tkyte.blogspot.com/2005/08/part-ii-seeing-restart.html
http://tkyte.blogspot.com/2005/09/part-iii-why-is-restart-important-to.html
大家都知道oracle通过一致性读来防止阻塞并为查询提供结果。但是对于写或者说编辑操作,oracle是怎样处理的那?例如下面的语句:
update t set x=2 where y=5;
对于这样的语句,oracle首先会根据语句的运行起始时间T1和WHERE条件进行基于T1的一致性查询操作,找出y=5的所有记录,然后对这些记录进行更新操作。那么这里就存在一个问题,假设在T2时间,oracle修改到记录R,如果在T1和T2之间的时间段里,某个用户进程修改了记录R并进行了提交,此时oracle会做如何处理那?我们知道,读操作我们可以基于以往时间点构造一致性块,但是对于写操作,我们必须对当前块进行操作。
首先我们在表tab上创建触发器
SQL> create or replace trigger tab_tri
2 before update on tab for each row
3 begin
4 dbms_output.put_line(' old.x = '||:old.x||',old.y ='||:old.y);
5 dbms_output.put_line(' new.x = '||:new.x||',new.y ='||:new.y);
6 end;
7 /
session1:更新某记录,不提交
SQL> update tab set x=2 where y=1;
session2:更新相同记录,进程被阻塞
SQL> update tab set x=3 where y=1;
session2:session1提交后
SQL> update tab set x=3 where y=1;
old.x = 1,old.y =1
new.x = 3,new.y =1
old.x = 2,old.y =1
new.x = 3,new.y =1
已更新 1 行。
从这里可以看出,如果更新R时,oracle发现R已经被修改过,那么oracle会重新执行update语句。下面让我们修改一下触发器
SQL> create or replace trigger tab_tri
2 before update on tab for each row
3 begin
4 dbms_output.put_line('aaaaa');
5 end;
6 /
session2:在session1提交后:
SQL> update tab set x=3 where y=1;
aaaaa
已更新 1 行。
非常奇怪?这里update语句并没有重新执行
下面在来改变一下执行语句:
sesion1:
SQL> update tab set y=2 where y=1;
已更新 1 行。
session2:
SQL> update tab set x=3 where y>0;
aaaaa
aaaaa
这里update语句再次重新执行。好,我们总结如下:
如果在update(delete没有测试,估计应该是相同的)语句的执行过程中,待操作记录发生了改变,并且被改变的列在where子句或者row触发器(after or before)的内部使用:old或者:new引用过,那么update语句会将之前的操作回滚并重新执行。这也是after触发器效率高于before触发器的一个原因,因为即便update重新执行,after触发器只执行一次,而befer触发器会执行两次。如果发生了restart,oracle会在第二次执行的过程中尝试使用select
for update来进行操作,以避免发生再一次的restart。但是即便使用select for update ,依然有可能发生restart。
下面看一下restart产生的影响:
1:如果触发器维护plsql中的全局变量,那么全局变量可能是不准确的
2:任何utl_函数,例如UTL_FILE, UTL_HTTP, UTL_SMTP,可能会执行两次,因此这些函数时非事务性的,无法回滚
3:自治事务当然也会受影响而执行多次
分享到:
相关推荐
vite-plugin-restart 自定义文件/全局文件以重新启动Vite服务器 用法 安装 npm i vite-plugin-restart -D # yarn add vite-plugin-restart -D 将其添加到vite.config.js // vite.config.js import ViteRestart ...
这个文档是来自鼎甲科技的姚远工作中整理的,在Virtualbox上安装Oracle 19.3 再升级到19.8(Oracle Restart和数据库)完整步骤,包括:配置系统环境,安装grid,oracle,建库,补丁下载升级等全过程。
redm-server-restart:重新启动用于Poodle's Palace的公告脚本
Oracle Restart[11204]+ASM+RHEL5安装手册.docx
重新启动一个 Clojure 库,为 Clojure 提供基本的 Common Lisp 风格重启。用法( with-restart-handlers {Exception ( fn [e] ( invoke-restart :continue )) :foobar ( fn [val] ( println " Got Value: " val))} ( ...
OracleRestart[11204]“加”ASM“加”RHEL5安装手册.docx
React本机重启 有时您想在应用程序运行时重新加载应用程序包。 该软件包将允许您执行此操作。 iOS GIF Android GIF安装使用react-native < 0>= 0.62 ? 安装react-native-restart@0.0.20及以上带yarn $ yarn add ...
含羞草重启 概述 当您删除某些文件夹/文件时,此模块将重新启动 Mimosa 进程。 有关含羞草的更多信息,请参阅 注意:此模块需要 Mimosa v2.2.4或更高版本。...restart: { updated : [ ] , deleted : [ ] } updated
# depending on parameter -- startup, shutdown, restart # of the instance and listener or usage display case "$1" in start) # Oracle listener and instance startup echo -n "Starting Oracle: " su - $ORA_...
ng-重启下载文件或通过 bower 安装 bower install ng-restart用法(1) 将 ng-restart.js 添加到您的主文件 (index.html) (2) 在你的模块中将 ngRestart 设置为依赖项 var myapp = angular . module ( 'myapp' , [ '...
这几个代码是关于添加噪声和均值滤波的,都是与图像处理有关的
cfc_daily_restart
.8(Oracle+Restart和数据库)完整步骤.pdf
laravel 地平线重启 重启多台服务器的Horizon supervisors,如php artisan queue:restart 安装 composer require huangdijia/laravel-horizon-restart 用法 php artisan horizon:restart
#Python程序以及运行 ... RESTART: C:\Users\Administrator\AppData\Local\Programs\Python\Python36\test.py //文件地址 Hello, World! 注意:一定要保存,要不不能运行。 第一行代码 #!/usr/bin/python3
吞咽自动重启 这个包添加了“gulp-auto-restart”任务。 用法 // gulpfile.js ... gulp auto-restart spawn child watch --restart process with watch --restart options and restart it on gulpfile.js change.
npm install cluster-rolling-restart server.js const cluster = require ( "cluster-rolling-restart" ) ; const express = require ( "express" ) ; const app = express ( ) ; app . get ( "/" , ( req , res )...
> RESTART:重新开始本关(删除所有连线) 近1500余代码,60个素材。此后仍有作品或有趣游戏、爆笑作品,请关注原作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送资源!快...