以下演示重启动问题,请注意 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重启动问题的更多相关文章

  1. installshield制作的安装包卸载时提示重启动的原因以及解决办法

    原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...

  2. YARN的重启动问题:RM Restart/RM HA/Timeline Server/NM Restart

    ResourceManger Restart ResourceManager负责资源管理和应用的调度,是YARN的核心组件,有可能存在单点失败的问题.ResourceManager Restart是使 ...

  3. Visual Studio 2013安装Update 3启动crash的解决方法

    Visual Studio 2013安装完Update 3后启动立刻crash,异常信息为: System.InvalidOperationException was unhandled Messag ...

  4. 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁

    重入锁 Java中的重入锁(即ReentrantLock)   与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...

  5. Hadoop 新生报道(二) hadoop2.6.0 集群系统版本安装和启动配置

    本次基于Hadoop2.6版本进行分布式配置,Linux系统是基于CentOS6.5 64位的版本.在此设置一个主节点和两个从节点. 准备3台虚拟机,分别为: 主机名 IP地址 master 192. ...

  6. centos7版本设置OS启动默认进入图形界面还是文本界面

    相比7之前的版本,在centos7版本中,设置OS启动默认进入图形界面还是文本界面有了点变化 检查当前默认设置 [root@rems2 ~]# systemctl get-default graphi ...

  7. Centos7以上的版本 mysql 无法启动,无法停止问题

    service mysqld start 始终提示如下: Failed to issue method call: Unit mysqld.service failed to load: No suc ...

  8. Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)

    这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程 ...

  9. Java并发(九):重入锁 ReentrantLock

    先做总结: 1.为什么要用ReentrantLock? (1)ReentrantLock与synchronized具有相同的功能和内存语义: (2)synchronized是重量级锁,性能不好.Ree ...

随机推荐

  1. hadoop中的分布式缓存——DistributedCache

    分布式缓存一个最重要的应用就是在进行join操作的时候,如果一个表很大,另一个表很小很小,我们就可以将这个小表进行广播处理,即每个计算节点 上都存一份,然后进行map端的连接操作,经过我的实验验证,这 ...

  2. hadoop2.2编程:自定义hadoop map/reduce输入文件切割InputFormat

    hadoop会对原始输入文件进行文件切割,然后把每个split传入mapper程序中进行处理,FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInput ...

  3. cat ,more, Less区别

    使用cat more less都可以查看文本内容,但是它们三者有什么区别呢?more和less的功能完全重复吗?以下是我个人的总结,欢迎大家一起来分享 cat        连续显示.查看文件内容mo ...

  4. WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

    首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼 ...

  5. JAVA与.NET的相互调用——通过Web服务实现相互调用

    JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候 ...

  6. curl与wget区别

    1.curl是libcurl这个库支持的,wget是一个纯粹的命令行命令.2.curl支持更多的协议.curl supports FTP, FTPS, HTTP, HTTPS, SCP, SFTP, ...

  7. redis 用setbit(bitmap)统计活跃用户

    getspool.com的重要统计数据是实时计算的.Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间.在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的 ...

  8. [原]H264帧内预测

    帧内预测模块大小 说明 4x4(亮度) 预测方式9种 8x8(亮度) 预测方式9种.只有high profile才有 16x16(亮度) 预测方式4种,只依赖左,上数据. 8x8(色度) 预测方式4种 ...

  9. Java笔记(二十)……线程间通信

    概述 当需要多线程配合完成一项任务时,往往需要用到线程间通信,以确保任务的稳步快速运行 相关语句 wait():挂起线程,释放锁,相当于自动放弃了执行权限 notify():唤醒wait等待队列里的第 ...

  10. CodeForces 361B Levko and Permutation

    题意:有n个数,这些数的范围是[1,n],并且每个数都是不相同的.你需要构造一个排列,使得这个排列上的数与它所在位置的序号的最大公约数满足 > 1,并且这些数的个数恰好满足k个,输出这样的一个排 ...