1. on commit delete rows
2.on commit preserve rows
[@more@]SQL> create global temporary table gt1 (id int) ;
表已创建。
SQL> insert into gt1 values(1);
已创建 1 行。
SQL> insert into gt1 values(2);
已创建 1 行。
SQL> select * from gt1;
ID
----------
1
2
SQL> commit;
提交完成。
SQL> select * from gt1;
未选定行
SQL> create global temporary table gt2 (id int) on commit delete rows ;
表已创建。
SQL> create global temporary table gt3 (id int) on commit preserve rows ;
表已创建。
SQL> insert into gt3 values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from gt3;
ID
----------
1
SQL> disconnect;
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 断开
SQL> connect/ as sysdba
已连接。
SQL> select * from gt3;
未选定行
SQL> grant connect ,resource to test;
授权成功。
SQL> select * from gt3;
未选定行
SQL> insert into gt3 values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> grant select on gt3 to test;
授权成功。
--=========================================
另一个session:
SQL> select * from sys.gt3;
未选定行
--==========================================
SQL> insert into gt1 values(1);
已创建 1 行。
SQL> select count(*) from v$transaction;
COUNT(*)
----------
1
SQL> select count(*) from v$locked_object ;
COUNT(*)
----------
0
SQL> rollback;
回退已完成。
SQL> select count(*) from v$transaction;
COUNT(*)
----------
0
SQL>
我们可以看出在通过dml操作temp table时也会开启事务,同样事务也需要commit或者rollback,但该事务却不对temp table进行lock,原因是不需要lock temp table,因为temp table的数据只能是当前session访问,类似于单用户操作temp table。但temp table的结构只要具备访问priv其他session都可以访问,我想正因为它的结构可以被其他session访问,所以oracle的temp table称为global temp table
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/19602/viewspace-1006802/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/19602/viewspace-1006802/