这是一个事实,当同一会话存在未提交事务时使用immediate选项无法关闭数据库。简单看一下这个现象。
1.模拟未提交事务
这里为了简便,会话session1直接在sys用户下创建表t进行测试。
sys@ora10g> create table t (x number);
Table created.
sys@ora10g> insert into t values (1);
1 row created.
2.使用immediate选项关闭数据库
sys@ora10g> shutdown immediate;
ORA-01097: cannot shutdown while in a transaction - commit or rollback first
OK,错误提示“ORA-01097”已经给出,提示信息解释的非常清楚。因此在同一个会话session1中如果存在未提交的事务使用immediate选项是没有办法关闭数据库的。
3.在其他会话中存在未提交事务时可被immediate选项关闭
1)首先我们提交上面第一个会话session1中的事务。
sys@ora10g> commit;
Commit complete.
2)另外开启一个session2
在开一个会话session2同样模拟一个未提交的事务
sys@ora10g> create table t2 (x number);
Table created.
sys@ora10g> insert into t2 values (2);
1 row created.
这里不要提交事务。
3)回到session1中执行具有immediate选项的关闭数据库命令
回到第一个窗口执行关闭数据库的操作
sys@ora10g> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
可见此时关闭动作可以成功完成。
可以进一步确认第二个会话session2已经被强制杀死。这也是immediate选项本应具有的能力。
sec@ora10g> select * from t;
select * from t
*
ERROR at line 1:
ORA-03135: connection lost contact
ERROR:
ORA-03114: not connected to ORACLE
4.体验无敌的abort方式关闭数据库
1)启动数据库
sys@ora10g> startup;
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2071640 bytes
Variable Size 125830056 bytes
Database Buffers 75497472 bytes
Redo Buffers 6316032 bytes
Database mounted.
Database opened.
2)重新模拟同一会话中未提交事务
sys@ora10g> select * from t;
X
----------
1
sys@ora10g> delete from t;
1 row deleted.
3)确认immediate选项无法关闭数据库
sys@ora10g> shutdown immediate;
ORA-01097: cannot shutdown while in a transaction - commit or rollback first
4)使用abort选项关闭数据库
sys@ora10g> shutdown abort;
ORACLE instance shut down.
sys@ora10g>
可见abort选项的“闪电断电式”关闭数据库的方法是毫无任何羁绊的!
5.小结
这里给出的是一个现象和事实。从中可以体会出不同关闭数据库方式的细微差别(这里仅仅讨论了immediate和abort选项)。
Good luck.
secooler
11.01.08
-- The End --
1.模拟未提交事务
这里为了简便,会话session1直接在sys用户下创建表t进行测试。
sys@ora10g> create table t (x number);
Table created.
sys@ora10g> insert into t values (1);
1 row created.
2.使用immediate选项关闭数据库
sys@ora10g> shutdown immediate;
ORA-01097: cannot shutdown while in a transaction - commit or rollback first
OK,错误提示“ORA-01097”已经给出,提示信息解释的非常清楚。因此在同一个会话session1中如果存在未提交的事务使用immediate选项是没有办法关闭数据库的。
3.在其他会话中存在未提交事务时可被immediate选项关闭
1)首先我们提交上面第一个会话session1中的事务。
sys@ora10g> commit;
Commit complete.
2)另外开启一个session2
在开一个会话session2同样模拟一个未提交的事务
sys@ora10g> create table t2 (x number);
Table created.
sys@ora10g> insert into t2 values (2);
1 row created.
这里不要提交事务。
3)回到session1中执行具有immediate选项的关闭数据库命令
回到第一个窗口执行关闭数据库的操作
sys@ora10g> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
可见此时关闭动作可以成功完成。
可以进一步确认第二个会话session2已经被强制杀死。这也是immediate选项本应具有的能力。
sec@ora10g> select * from t;
select * from t
*
ERROR at line 1:
ORA-03135: connection lost contact
ERROR:
ORA-03114: not connected to ORACLE
4.体验无敌的abort方式关闭数据库
1)启动数据库
sys@ora10g> startup;
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2071640 bytes
Variable Size 125830056 bytes
Database Buffers 75497472 bytes
Redo Buffers 6316032 bytes
Database mounted.
Database opened.
2)重新模拟同一会话中未提交事务
sys@ora10g> select * from t;
X
----------
1
sys@ora10g> delete from t;
1 row deleted.
3)确认immediate选项无法关闭数据库
sys@ora10g> shutdown immediate;
ORA-01097: cannot shutdown while in a transaction - commit or rollback first
4)使用abort选项关闭数据库
sys@ora10g> shutdown abort;
ORACLE instance shut down.
sys@ora10g>
可见abort选项的“闪电断电式”关闭数据库的方法是毫无任何羁绊的!
5.小结
这里给出的是一个现象和事实。从中可以体会出不同关闭数据库方式的细微差别(这里仅仅讨论了immediate和abort选项)。
Good luck.
secooler
11.01.08
-- The End --
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/519536/viewspace-683634/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/519536/viewspace-683634/