一个事务只能被指派被一个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