练习 DOUBLE INSERT
练习 DOUBLE INSERT
目标:从一张表取数据插入到另一张表中,此外需要为插入的目标表做一个应用级的日志表,也就是说在插入目标表的同时,还需要将相同的数据插入到日志表中。

在案例一中,我们给出了CREATE TRIGGER;OPEN CURSOR ;BULK INTO VARIABLE; DOUBLE INSERT; INSERT ALL 等方案。每个方案中也阐述了他的优缺点。
其中在DOUBLE INSERT,为了保证数据的一致性,又给出了四种思路,它们分别是锁,串行,临时表和as of 查询。下面将展现这四种思路SQL的展现。
当然DOUBLE INSERT 除了一致性的问题,还有原子性的问题,即有可有目标表和 日志表只成功了其它一个,或都没成功。关于原子性的问题。暂不讨论。
1.1思路一 锁
Drop table test;
Drop table T_ORG;
DROP TABLE T_LOG;
create table test as select * from all_objects ;
create table T_ORG as select * from all_objects WHERE 1=2;
create table T_LOG as select * from all_objects WHERE 1=2;
# --共享行专用(SRX):阻止其他事务操作,其会会话不能对test表进行DML操作
SQL> lock table t in exclusive mode nowait;
Locked Object:
OWNEROS_USER_NAME OBJECT_NAME SIDSERIAL# LOCKED_MODE LOGON_TIM
------- ------------- ----------------- ---------- ----------- -------
SYS oracle TEST 18 17 6 26-APR-19
SYS@test>INSERT INTO T_ORG SELECT * FROM TEST;
72183 rows created.
SYS@test>INSERT INTO T_LOG SELECT * FROM TEST;
72183 rows created.
新开一个窗口执行delete 操作产生等待:
SYS@test2>delete from test where OBJECT_ID <10 ;
直到原来窗口事务结束。
SYS@test>COMMIT ;
问题:影响其它事务
1.2思路二 串行事务面临的问题 ora-01555
Drop table test;
Drop table T_ORG;
DROP TABLE T_LOG;
create table test as select * from all_objects ;
create table T_ORG as select * from all_objects WHERE 1=2;
create table T_LOG as select * from all_objects WHERE 1=2;
SYS@test>create undo tablespace undotbs datafile '/u01/app/oracle/oradata/test/undotbs.dbf' size 1M ;
Tablespace created.
SYS@test>alter system set undo_tablespace=undotbs;
SYS@test>show parameter undo ;
NAME TYPE VALUE
------------------------------------ ----------- ---------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS
declare
begin
INSERT INTO T_ORG SELECT * FROM TEST;
INSERT INTO T_LOG SELECT * FROM TEST;
Commit ;
end ;
/
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS'
ORA-06512: at line 3
SYS@test>select count(*) from T_ORG ;
COUNT(*)
----------
0
问题:UNDO 空间不足时,会报ORA-30036
如果UNDO空间被覆盖会报ORA-01555
1.3思路三 临时表
Drop table test;
Drop table T_ORG;
DROP TABLE T_LOG;
create table test as select * from all_objects ;
create table T_ORG as select * from all_objects WHERE 1=2;
create table T_LOG as select * from all_objects WHERE 1=2;
SYS@test>alter system set undo_tablespace=UNDOTBS1;
创建会话级别临时表:
SYS@test> create global temporary table temp1 on
Commit Preserve Rows as select * from
all_objects where 1=2 ;
把数据写入到临时表:
SYS@test>INSERT INTO temp1 SELECT * FROM all_objects;
72186 rows created.
SYS@test>INSERT INTO T_ORG SELECT * FROM temp1;
72186 rows created.
SYS@test>INSERT INTO T_LOG SELECT * FROM temp1;
72186 rows created.
问题:相关于写了三次,读了三次,对性能影响较大
1.4思路四 AS OF 查询
Drop table test;
Drop table T_ORG;
DROP TABLE T_LOG;
create table test as select * from all_objects ;
create table T_ORG as select * from all_objects WHERE 1=2;
create table T_LOG as select * from all_objects WHERE 1=2;
SYS@test>select current_scn from v$database ;
CURRENT_SCN
-----------
975216
SYS@test>INSERT INTO T_ORG SELECT * FROM test as of
scn 975216;
72184 rows created.
SYS@test>INSERT INTO T_LOG SELECT * FROM test as of
scn 975216;
72184 rows created.
前提是你要提前查询SCN 或时间,而且还是查询插入了2次。
针对以上的问题,最好的解决方案是利用ORACLE 的insert all
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
练习 DOUBLE INSERT的更多相关文章
- Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来
转载自:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype ...
- Mybatis3.x与Spring4.x整合(转)
http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:cre ...
- MyBatis入门学习教程-Mybatis3.x与Spring4.x整合
一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...
- SQL 行列倒置
SQL的的行列倒置已经不是新知识了,但在博主的技术咨询期间,仍发现其实有很多人并不了解这块,所以在此专门写一篇博客记录.本文将以Mysql为例,并以数据采集指标信息获取为例子.在下面的例子,你可以在s ...
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...
- 扫描线 + 线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage
Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit user ...
- [转]Mybatis3.x与Spring4.x整合
原文地址:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetyp ...
- jdbc事务处理和连接池
JDBC: * JDBC概念:Java DataBase Connectivity(Java数据库连接) SUN公司提供的一组连接数据库API. * JDBC开发步骤: * 1.注册驱动. * 2.获 ...
随机推荐
- 编写高质量代码改善C#程序的157个建议——建议105:使用私有构造函数强化单例
建议105:使用私有构造函数强化单例 单例指一个类型只生成一个实例对象.单例的一个简单实现如下所示: static void Main(string[] args) { Singleton.Insta ...
- 编写高质量代码改善C#程序的157个建议——建议80:用Task代替ThreadPool
建议80:用Task代替ThreadPool ThreadPool相对于Thread来说具有很多优势,但是ThreadPool在使用上却存在一定的不方便.比如: ThreadPool不支持线程的取消. ...
- unittest测试框架详谈及实操(三)
断言 unittest的TestCase类提供了很多实用的方法来校验预期结果和程序返回的实际结果是否一致.当然这些方法要求必须满足某些条件才能继续执行接下的测试.大致有3种这样的方法.各覆盖一个特定类 ...
- MySQL查询表内重复记录并删除
在日常业务场景中,经常会出现一个问题就是解决数据重复的问题,这里用到了一张用户表(s_user)做重复数据操作,分别包含了两个字段,id.name分别用于做唯一标示以及相同姓名的检索. 表结构以及测试 ...
- 2、Semantic-UI之网格布局
2.1 网格布局 在semantic-ui中提供了16个网格,使用class="column",当然也可以通过数字来表示当前网格大小. 在Semantic-UI中定义的网格 ...
- 只是误以为导入了maven依赖
背景: 之前用Spring Boot 开发了一个小项目,考虑将代码迁到Git服务器,由于之前没用过Git,在将代码正式签入Git服务器前, 我想先签入一个最简单的Spring Boot程序代码作为试验 ...
- C#多线程学习(三) 生产者和消费者
前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...
- TestNG+Selenium
是一个开源自动化测试框架.其实类似于JUnit这种单元测试框架,但进行了一些功能扩展 属于selenium?还是说TestNG是一个测试框架,它用到了selenium的web自动化测试的功能,比如使用 ...
- 「HNOI 2013」数列
题目链接 戳我 \(Solution\) 这道题貌似并不难的样子\(QAQ\) 我们发现这个因为有首项的关系所以有点不太好弄.所以我们要将这个首项对答案的影响给去掉. 我们可以构建一个差分数组,我们令 ...
- C++的可移植性和跨平台开发
概述 今天聊聊C++的可移植性问题.如果你平时使用C++进行开发,并且你对C++的可移植性问题不是非常清楚,那么我建议你看看这个系列.即使你目前没有跨平台开发的需要,了解可移植性方面的知识对你还是很有 ...