【DDL】DDL執行過程及其隱式COMMIT行為的探查與演示
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 --
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle DDL 執行過程Oracle
- 【DDL】DDL的隱式commit和自治事務MIT
- Oracle DDL 執行過程【Blog 搬家】Oracle
- MySQL DDL執行方式-Online DDL介紹MySql
- 禁止DDL執行的trigger
- 乾貨好文:分散式資料庫DDL的編譯與執行分散式資料庫編譯
- 在函式中執行DDL語句失敗函式
- 配置ogg ddl 執行 ddl_setup 報錯處理方法
- DDL觸發器設定導致DDL無法執行(二)觸發器
- DDL觸發器設定導致DDL無法執行(一)觸發器
- 為已經執行的GoldenGate開啟DDL選項Go
- MySQL 常用DDL執行方式總結MySql
- Oracle ddl隱式提交注意點Oracle
- 通過flashback_transaction_query查詢最近執行過的所有DDL語句
- 執行oracle DDL語句要注意的問題Oracle
- Oracle 執行 DDL 長時間無響應Oracle
- 【顯式授權】Procedure中無法完成DDL的建表操作的原因探查
- logmnr挖掘中間有DDL的操作示例-對於執行DDL前的操作無法挖掘
- Oracle 儲存過程中的DDL語句Oracle儲存過程
- MySQL 執行DDL語句 hang住了怎麼辦?MySql
- goldengate ddl_setup執行失敗處理Go
- 【實驗】【MySQL】MySQL的DDL語言演示MySql
- 再論執行oracle DDL語句要注意的問題Oracle
- js函式執行過程的探究JS函式
- MySQL 執行 Online DDL 操作報錯空間不足?MySql
- 指令的執行過程
- 儲存過程中DDL錯誤一例儲存過程
- ASP.NET 2.0執行原理及其過程簡要分析ASP.NET
- 執行緒池建立執行緒的過程執行緒
- oracle dbms_sql執行查詢select_dml_ddl(一)OracleSQL
- sql 執行過程SQL
- Redis 命令的執行過程Redis
- HiveSQL的執行過程分析HiveSQL
- jsp的執行過程JS
- javascript引擎執行的過程的理解--執行階段JavaScript
- 使用自治事務在觸發器中執行DDL語句示例觸發器
- 為Oracle配置DDL複製Oracle
- 怎樣得到建表(儲存過程,函式等)的DDL指令碼,請看案例儲存過程函式指令碼