并发与多版本: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 ...
随机推荐
- WCF - Consuming WCF Service
WCF services allow other applications to access or consume them. A WCF service can be consumed by ma ...
- poj2286The Rotation Game(迭代加深dfs)
链接 把迭代加深理解错了 自己写了半天也没写对 所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索.这种方法虽然会导致重复的遍历 某些结点,但 ...
- apache开源项目--lucence
Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.Lucene的目的是为软件开发人员提供一个简单易用 ...
- 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密
关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修改并释放锁,否则其他用户就无法修改该组数据. 有些数据库,包括SQL Se ...
- EventHandlerList z
写一个类时,有时候会在同一个类上添加很多事件,事件很多的话,是不容易管理的,.NET提供的EventHandlerList可以辅助多个事件的管 理,但不方便的地方是,它不是类型安全的,缺少类型安全,多 ...
- dev combobox edit 怎么设置让选项清空
dev combobox edit 怎么设置让选项清空 功能需求: 点击combobox edit1的选项A 使得 combobox edit2出现选项a: 然后再点击combobox edit1的选 ...
- 查看tablespace的使用情况
by tablespace(使用单位G): SELECT a.tablespace_name,(all_size-b.unuse_size) use_size,b.unuse_size,a.all_s ...
- jsp简易文件上传(common.fileupload)
昨天开始重新架构我的V&View(维视),之前写文章使用的是一个kindediter的插件,挺好用的.最近不知道咋了,出现了些小问题.早在写V&View的时候就想用以下两种方法实现文章 ...
- 我的新顶级域名vell001.ml
好不容易找到了一个免费的顶级域名啊,各种爽啊... 没钱的娃就只能各种求免费了!!! 以后访问我的所有站点都可以从vell001.ml开始了 Vell001主站 VellBlog VellForum
- HW4.5
public class Solution { public static void main(String[] args) { final double POUNDS_PER_KILOGRAM = ...