切换UNDO表空间--DDL使事务自动提交

来源:互联网 发布:软件系统设计方法 编辑:程序博客网 时间:2024/05/05 03:41

一个事务只能被指派被一个undo段服务,一个事务生成的撤销数据无法被分配到多个undo段中,但是一个undo段可以为多个事务服务。

今天一个切换UNDO表空间时,发现未提交的数据,在切换UNDO表空间后被自动提交了。

原因:切换undo表空间相当于执行ddl语句,会自动提交事务。

1.会话1:执行DML操作后不提交,同时修改UNDO表空间。

SQL> set time on
16:25:28 SQL> show parameter undo
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      test1_undo
16:25:36 SQL> select * from test;

         A B
---------- --------------------

16:27:22 SQL> insert into test values(222,333);
1 row inserted
16:27:34 SQL> insert into test values(222,333);
1 row inserted
16:27:35 SQL> insert into test values(222,333);
1 row inserted
16:27:35 SQL> insert into test values(222,333);

1 row inserted

切换UNDO表空间--事先创建好。

16:28:02 SQL> alter system set undo_tablespace='undotbs1';
System altered
16:28:58 SQL> show parameter undo
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      undotbs1
16:29:08 SQL>
即使执行ROLLBACK操作,数据无回退,也侧面证明了切换UNDO表空间时未提交的数据被提交了。
16:30:29 SQL> rollback;
Rollback complete

16:30:33 SQL> select * from test;

         A B
---------- --------------------
       222 333
       222 333
       222 333
       222 333
#######################################

会话2查询会话1的事务提交数据

之前不能查询原因是事务隔离等级。当前会话切换UNDO是DDL操作产生事务提交,但是切换UNDO表空间不会提交(影响)其它会话的未提交事务。

在会话1执行DML操作未提交,也未切换UNDO表空间时,查询不到数据。
16:27:54 SQL> select * from test;
         A B
---------- --------------------

16:27:55 SQL>
切换UNDO表空间后(16:28:02提交的),可以查询到数据。
16:29:14 SQL> select * from test;
         A B
---------- --------------------
       222 333
       222 333
       222 333
       222 333
原创粉丝点击