Oracle數據庫對DDL語句和DML語句的事務管理
Oracle數據庫操作中,我們會遇到處理DDL語句和DML語句的情況,如果遇到了Oracle DDL語句和DML語句需要在一個事務中一塊處理的情況,該方法要么成功,要么失敗。對于這個問題,SQL Server等數據庫是可以解決的,因為其能對DDL語句做回滾,而Oracle在執行DDL語句時會先執行commit,所以就不能對DDL語句回滾了。
事務相關概念:
1、首先,說說數據庫對事務的相關定義:
在數據庫中事務是工作的邏輯單元 , 一個事務是由一個或多個完成一組的相關行為的 SQL 語句組成 , 通過事務機制確保這一組 SQL 語句所作的操作要么完全成功執行 , 完成整個工作單元操作 , 要么一點也不執行。 事務具有ACID特性(即:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)),ACID的概念在ISO/IEC 10026-1:1992文件的第四段內有所說明(我找了半天也沒下載到這個標準,誰有的送我一份啊,呵呵)。
2、假設Oracle版本為10g,10g對應的jdbc版本為3。看一下JDBC3有關事務概念:
JDBC3提到了事務和分布式事務。對于大家經常說的嵌套事務,沒有提及。數據庫本質上從來沒有過嵌套事務的概念,只是應用程序為了不同的目的將對事務的操作過程嵌套起來,即使是Oracle的自治事務也可劃為應用程序(存儲過程或是觸發器什么的), 從應用角度講,嵌套事務處理就是應用程序如何將應用層面的嵌套轉變為數據庫層面的單事務操作, 這方面Java領域的EJB,Spring提供了解決方案,另外提一下JTA,它提供了事務的suspend,resume功能,實質上其實數據庫事務那里有什么掛起什么的概念,其僅僅是換了一個數據庫連接,這樣新的數據庫事務開始了,老的數據庫事務便不再操作,直接其被resume。)。
解決方法:
要想解決一個問題,找到問題的關鍵所在,就等于成功了一半。如上所述,該問題的關鍵所在又是什么呢?
Oracle在執行DDL語句時會先執行commit,所以就不能對DDL語句進行回滾。jdbc事務也不提供相關方法來進行回滾(spring、ejb或許可以,但沒測試過,不好說)。
既然應用的一些框架不能提供該功能,就只能自己想辦法解決了,怎么解決?反向操作!或許感覺有些麻煩,但不這么做又如何呢,在操作SQL語句成功后,后邊跟著反向操作的定義(內部類派上用場了),在一個大的事務中,如果出現異常,在異常的地方把反向操作執行一把即可。再進一步,如果讓所有的DDL語句能和DML語句用不同的數據庫連接,那么DML語句就不用反向操作了,節省了很多工作量,DML語句用事務的回滾多好啊!當然這樣做的前提是,在DDL執行時,不能和DML操作的資源引起沖突,即鎖的問題。
關于Oracle數據庫對DDL語句和DML語句的事務管理的知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!
【編輯推薦】