【Shutdown】同一會話存在未提交事務時使用immediate選項無法關閉資料庫

secooler發表於2011-01-08
這是一個事實,當同一會話存在未提交事務時使用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 --


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-683634/,如需轉載,請註明出處,否則將追究法律責任。

相關文章