并发与多版本:update重启动问题
以下演示重启动问题,请注意 before触发器和after触发器的行为区别,因为before触发器会触发两次而导致重启动问题,因此使用after触发器更加高效,应该尽量避免在所有触发器中使用自治事务
-------演示before触发器导致的查询重启动问题
1、创建测试表
create table test4(x number, y number);
insert into test4 values (1,4);
commit;
2、创建before触发器
create or replace trigger t4
before update on test4 for each row
begin
dbms_output.put_line('old.y-->'||:old.y);
dbms_output.put_line('new.y-->'||:new.y);
end;
3、执行更新
session 1:
SQL> select vm.*,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from v$mystat vm where rownum =1;
SID STATISTIC# VALUE TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
---------- ---------- ---------- ------------------------------
13 0 0 2016-04-28 10:05:44
SQL> update test4 set y=y+1 where x=1;
old.y-->4
new.y-->5
1 row updated
---注:此时不提交
session 2:
SQL> select vm.*,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from v$mystat vm where rownum =1;
SID STATISTIC# VALUE TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
---------- ---------- ---------- ------------------------------
73 0 0 2016-04-28 10:07:31
SQL> update test4 set y=y+1 where x=1;
---此时session2 会被session阻塞,一直等待session1提交或回滚;
返回至session1,执行提交;
SQL> commit;
Commit complete
---此时切换到session2查看,发现before 触发器打印的信息有点奇怪,这个现象就是重启动
old.y-->4
new.y-->5
old.y-->5
new.y-->6
1 row updated
4、修改before触发器,不使用:old和:new,再次重复上述1~3过程,发现不在出现重启动现象
create or replace trigger t4
before update on test4 for each row
begin
dbms_output.put_line('this is before trigger');
end;
session1:
SQL> update test4 set y=y+1 where x=1;
this is a before trigger
1 row updated
session2:
SQL> update test4 set y=y+1 where x=1;
this is a before trigger
1 row updated (此时被session1阻塞)
返回session1执行提交:
SQL> commit;
Commit complete
返回session2查看结果:
SQL> update test4 set y=y+1 where x=1;
this is a before trigger
1 row updated
-------演示after触发器不会导致查询重启动
1、先drop before 触发器:
SQL> drop trigger t4;
Trigger dropped
2、创建after触发器:
create or replacetrigger t5
after update on test4 for each row
begin
dbms_output.put_line( 'old.y-->'||:old.y);
dbms_output.put_line('new.y-->'||:new.y);
end;
3、执行更新
session1:
SQL> update test4 set y=y+1 where x=1;
old.y-->7
new.y-->8
1 row updated
session2:
SQL> update test4 set y=y+1 where x=1; ---由于session1未提交,session2此时被阻塞
返回session1,执行提交:
SQL> commit;
Commit complete
返回session2 查看结果:
old.y-->8
new.y-->9
1 row updated
注:此时并没有输出4行,而只是输出2行
----以上信息来自tom书籍
并发与多版本:update重启动问题的更多相关文章
- installshield制作的安装包卸载时提示重启动的原因以及解决办法
原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...
- YARN的重启动问题:RM Restart/RM HA/Timeline Server/NM Restart
ResourceManger Restart ResourceManager负责资源管理和应用的调度,是YARN的核心组件,有可能存在单点失败的问题.ResourceManager Restart是使 ...
- Visual Studio 2013安装Update 3启动crash的解决方法
Visual Studio 2013安装完Update 3后启动立刻crash,异常信息为: System.InvalidOperationException was unhandled Messag ...
- 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁
重入锁 Java中的重入锁(即ReentrantLock) 与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...
- Hadoop 新生报道(二) hadoop2.6.0 集群系统版本安装和启动配置
本次基于Hadoop2.6版本进行分布式配置,Linux系统是基于CentOS6.5 64位的版本.在此设置一个主节点和两个从节点. 准备3台虚拟机,分别为: 主机名 IP地址 master 192. ...
- centos7版本设置OS启动默认进入图形界面还是文本界面
相比7之前的版本,在centos7版本中,设置OS启动默认进入图形界面还是文本界面有了点变化 检查当前默认设置 [root@rems2 ~]# systemctl get-default graphi ...
- Centos7以上的版本 mysql 无法启动,无法停止问题
service mysqld start 始终提示如下: Failed to issue method call: Unit mysqld.service failed to load: No suc ...
- Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)
这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程 ...
- Java并发(九):重入锁 ReentrantLock
先做总结: 1.为什么要用ReentrantLock? (1)ReentrantLock与synchronized具有相同的功能和内存语义: (2)synchronized是重量级锁,性能不好.Ree ...
随机推荐
- Android开发UI之Notification
Notification,顾名思义,通知,就是我们常说的系统推送. 官网链接:http://developer.android.com/reference/android/app/Notificati ...
- 用if else 判断是不是7的倍数等
static void Main(string[] args) { while (true) { int b; ...
- Cookie的前后台应用
1.jquery.cookie.js的基本应用 这个是第三方js插件,可以更方便的设置和使用cookie $.cookie("UserName", "kingtiger& ...
- js模拟Map对象,实现key---value
js模拟Map对象,实现key---value 根据java中map的属性,实现key----value保存 function Map() { var struct = function (key, ...
- VS2005 工程在win7下使用管理员权限运行
想关资料 http://stackoverflow.com/questions/13030492/set-administrator-privilege-for-my-c-application-in ...
- oracle 的 regexp_substr()的用法
将字符串'1-2' 截取出来成1 .2,然后通过这两个值查出数据张三.李四 ,拼接起来成'张三-李四' oracle 语法 SELECT replace(WMSYS.WM_CONCAT(wrxm), ...
- web测试中,各类web控件测试点总结
一 .界面检查 进入一个页面测试,首先是检查title,页面排版,字段等,而不是马上进入文本框校验 1.页面名称title是否正确 2.当前位置是否可见 您的位置:xxx>xxxx 3.文字格 ...
- 【转】RDO、SAD、SATD、λ
SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即绝对误差和 SATD(Sum of Absolute Transformed Di ...
- 【JS】Intermediate9:jQuery: Other Tricks
1.DOMContentLoaded Run JavaScript only when the DOM is loaded and ready (but before stylesheets are ...
- NOIP2002 字串变换
题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...