并发与多版本: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 ...
随机推荐
- hadoop 序列化源码浅析
1.Writable接口 Hadoop 并没有使用 JAVA 的序列化,而是引入了自己实的序列化系统, package org.apache.hadoop.io 这个包中定义了大量的可 ...
- jQuery里面的datepicker日期控件默认是显示英文的,如何显示中文或其他语言呢?
jQuery里面的datepicker日期控件默认是显示英文的,如何让他显示中文或其他呢? [官方的写法]: (1)引入JS文件: <script type="text/javascr ...
- Warning: Function created with compilation errors!
解决方案: sqlplus / as sysdba grant execute on UTL_I18N to scott; grant execute on DBMS_CRYPTO to scott;
- 2DPlatformer-SLua 编辑器 UI 美化
在我的开源项目 2DPlatformer-SLua 中,YwLuaMonoBehaviour 是非常重要的一个组件,它负责从 MonoBehaviour 中直接驱动内建的事件到 Lua 中的类和逻辑, ...
- [codevs2152]滑雪
题目来源 http://www.tyvj.cn/p/1004 http://www.luogu.org/problem/show?pid=1434# http://codevs.cn/problem/ ...
- [NOIP2011]数的划分
本题地址:http://www.luogu.org/problem/show?pid=1025 题目描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序).例如:n=7,k=3,下面三 ...
- shell截取字符串方法
shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法.${parameter:-word}${parameter:=word}${parameter:?word}${p ...
- Ant执行一个含有main方法的class文件
目前需要使用ant来执行一个含有main方法的class文件,并且需要通过命令来行传两个参数(start和end)到main方法. <target name="gsp" de ...
- NSDictionary或NSArray与JSON字符串相互转换
在iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类.通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. 以前,我记得我用的是 ...
- oc学习之路----scrollView的代理模式
右图是OC里面scrollView的代理的描述,从这里可以开出来,任何对象都可以作为scorllView的代理对象只要实现了UIScrollViewDelegate这个协议,为什么呢,原因要追究到UI ...