【DDL】DDL執行過程及其隱式COMMIT行為的探查與演示

secooler發表於2009-11-02
1.先給出DDL語句執行過程的虛擬碼描述
BEGIN
  commit;
  DDL語句的解析,包括語法解析和語義解析;
  BEGIN
    執行DDL語句;
    commit;
  exception
    when others then
    rollback;
  END;
END;

2.注意commit和rollback出現的地方
1)第一個commit,說明無論DDL語句執行成功與否,之前的所有操作均會被commit;
2)第二個commit,說明如果DDL執行成功,則沒有“後悔藥”可以吃,DDL語句即刻提交;
3)rollback,表示如果DDL執行失敗,DDL本身的操作全部回退,但同樣無法左右該DDL之前的那些被提交的操作行為。

3.透過一個scenario演示一下第一個commit的“可怕”之處
1)一位“神仙大人”手中有一張包含1萬行記錄的生產資料表t。
sec@ora10g> select count(*) from t;

  COUNT(*)
----------
     10000

2)“神仙大人”想要刪除表中的一條記錄,但是因為沒有使用where子句,“誤操作”刪除了這張表的全部內容。這種誤操作雖然可能性極小,不過這位“神仙大人”也有打瞌睡的時候。
sec@ora10g> delete from t;

10000 rows deleted.

3)這位“神仙大人”沒有注意上面的1萬行記錄被刪除的提示,鬼使神差的建立了一個序列s,目的是使用這個序列s完成他後續的維護任務。注意建立序列是一個DDL操作。
sec@ora10g> create sequence s;

Sequence created.

4)“神仙大人”在查詢t表記錄數後,猛然間意識到自己犯了一個重大的錯誤,一身冷汗!
sec@ora10g> select count(*) from t;

  COUNT(*)
----------
         0

5)“神仙大人”使用rollback回滾剛才的誤操作,想找回一點點顏面。
sec@ora10g> rollback;

Rollback complete.

6)心神未定的“神仙大人”以為可以找回曾經失去的生產資料,可惜一切已經太遲、太遲了。
sec@ora10g> select count(*) from t;

  COUNT(*)
----------
         0

4.小結
這位“神仙大人”為什麼無法回滾曾經的誤操作?答案自明。
“神仙大人”經過這一次的洗禮,總結出以下幾點:
1)對於SQL語句(DDL和DML)的執行過程需要了如指掌,避免一切死角;
2)在操作生產資料庫的時候嚴謹“走神”,任何的誤操作都是無法饒恕的;
3)在平時多加總結和積累;
4)在對生產資料庫維護之前,如果有可能最好可以在測試資料庫上先行操練一次;
5)細節決定價值,注意一切隱式行為的危害;
6)膽大心細,坐懷不亂(“神仙大人”的誤操作也是有高階辦法恢復的,不可一蹶不振)。

-- The End --

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

相關文章