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