关于全局临时表的总结与实验

全局临时表有2种,一种是会话级,一种是事务级。

所以,要学习全局临时表,先理解一下什么是会话?什么是事务?二者有什么关系?

一、会话与事务

通俗点理解:小明和小丽异地恋,这天小明给小丽打电话,从打通电话到挂断电话期间都叫会话(session),会话期间可以谈论多个事务(transaction),第一个事务,小明向小丽表达了相思之苦,第二个事力,小丽向小明讲了讲同事小美和隔壁老王的故事,第三个事务,小丽告诉小明自己喜欢某网店的一个包包很久了,舍不得买,小明说马上把链接给我,我给你下单……最后小明的手机没电了,会话因客观原因结束……

用户登录到数据库后到用户登出(主动或被动)叫会话(session),一次会话可以处理多个事务(transaction)。
所以会话session可以指一次连接,事务是指一个操作单元,要么成功,要么失败,没有中间状态,事务通过commit或rollback结束。

关于事务经典的例子是转账操作:
比如老王睡醒后要给小美转账服务费500元,两人两个账户的余额数据都要修改,老王原账户余额600元,小美原账户余额9500,转账操作时,既要将老王的余额变成100,还得将小美余额变成10000,要么成功,要么失败,不可能让老王余额变成100,小美余额还是9500元,如果这样,小美指定不让老王走,老王同时也会投诉银行:“老子的钱飞哪儿去了?”。
所以,事务内的所有操作(老王余额减少500,小美余额增加500)要么成功,要么失败。

知识点:
通过视图 v$session查看会话,通过视图 v$transaction查看事务,这两张视图通过 v$session.taddr= v$transaction.addr 连接

比如:用户T071登录SQLPLUS后
通过SYS用户查看
select * from v$session where username='T071'
发现有1条记录
同时使用用户T071登录另一个SQLPLUS窗口后,通过SYS用户查看
select * from v$session where username='T071'
发现有2条记录
说明T071有2个会话。
-----------------------------------
SADDR    SID    SERIAL#    AUDSID
51F88AB8    1    21    903425
51F44E58    26    882    903426
-----------------------------------

在第一个t071会话中创建YEb表
create table yeb(username varchar2(10),ye number);
insert into yeb values('老王',600);
insert into yeb values('小美',9500);
commit;

使用用户SYS先查看一下如下视图

select * from v$transaction
发现没有任何执行中的事务

下面要在第二个会话窗口模拟老王给小美转账500元的事务。
update yeb set ye=ye-500 where username='老王';
update yeb set ye=ye+500 where username='小美';

没有提交commit或回滚rollback前,此时事务可以通过用户sys执行:


select * from v$transaction
发现执行中的事务
----------------------------------
ADDR    XIDUSN    XIDSLOT    XIDSQN
50596DE8    5    5    2196
----------------------------------

其中的addr值为50596DE8 正好对应V$session中第二条记录的taddr
select sid,username,taddr from v$session where username='T071'

-----------------------------------
       SID    USERNAME    TADDR
1    1    T071    
2    26    T071    50596DE8
-----------------------------------


第二个sqlplus窗口执行commit操作后

执行:
select * from v$transaction
无记录

执行
select sid,username,taddr from v$session where username='T071'
对应taddr无数据

 

二、全局临时表

oracle的临时表又叫全局临时表(GLOBAL TEMPORARY TABLE),是用来保存事务或会话期间的中间结果。

当前会话在在临时表中保存的数据只有对当前会话是可见的,其余会话不可见,即使在当前会话COMMIT数据以后,其余会话在也是不可见的。

同一张临时表支持多会话并行操作,一个会话从来不阻塞另一个会话使用临时表。即使锁定临时表,一个会话也不会阻塞其他会话使用临时表。临时表比正常表产生的REDO少得多,然而,由于临时表必须产生包含数据的UNDO信息,所以会产生一定数量的REDO日志。

临时表在每个数据库中只需创建一次,便总是存在,除非手动的删除他(有会话在使用中的临时表不能删除)。临时表作为对象存在数据字典中,并且总是保持为空,直到有会话在其中放入数据。Oracle允许创建基于临时表的视图和存储过程。

临时表可以是以会话为基础的,也可以是以事务为基础的。ON COMMIT PRESERVE ROWS子句使临时表成为基于会话的模式。行将留在此表中,直到会话断开或通过DELETE或TRUNCATE从物理上删除这些行。ON COMMIT DELETE ROWS子句使临时表成为基于事务的模式。当会话提交后,行消失。这个临时表的自动清除过程不会有额外的开销。

通过会话1由用户t071执行如下语句:

--如下语句创建的是会话级临时表,其中的数据在不当前会话不删除的情况 下,默认保存至会话结束后自动清空
CREATE GLOBAL TEMPORARY TABLE GTT_session(
C1  NUMBER
) ON COMMIT PRESERVE ROWS ;

--如下语句创建的是事务级临时表,在事务结束时,清空其中的数据
CREATE GLOBAL TEMPORARY TABLE GTT_transaction(
C1  NUMBER
) ON COMMIT DELETE ROWS ;

insert into GTT_session values (1);
insert into GTT_transaction values (1);

select * from GTT_session --有一条记录
select * from GTT_transaction --有一条记录
commit;
select * from GTT_session --有一条记录
select * from GTT_transaction --没有记录

 

通过会话2由用户t071执行如下语句:

insert into GTT_session values (2);
commit;
select * from GTT_session --有一条数据,与会话1数据互不影响 

关闭上面2个会话,重新建立新会话后执行如下语句

select * from GTT_session --语句可以执行,说明表存在,只是没有数据
select * from GTT_transaction --语句可以执行,说明表存在,只是没有数据

 

 

更多2019年oracle认证OCP考试071新题解析讨论请加入QQ群:479384490

更多2019年oracle认证OCP考试052新题解析讨论请加入QQ群:479384490

更多2019年oracle认证OCP考试053新题解析讨论请加入QQ群:479384490

更多2019年oracle认证OCP考试062新题解析讨论请加入QQ群:479384490

更多2019年oracle认证OCP考试063新题解析讨论请加入QQ群:479384490

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值