談談對Oracle處理DDL和DML語句的事務管理 |
| 發(fā)布時間: 2012/8/26 15:43:26 |
|
一、先說問題 在開發(fā)過程中,遇到了Oracle DDL語句和DML語句需要在一個事務中一塊處理的情況,該方法要么成功,要么失敗。對于這個問題,sql server等數(shù)據(jù)庫是可以解決的,因為其能對DDL語句做回滾,而oracle在執(zhí)行ddl語句時會先執(zhí)行commit,所以就不能對DDL語句回滾了。 二、事務相關概念 1、 首先,說說數(shù)據(jù)庫對事務的相關定義: 在數(shù)據(jù)庫中事務是工作的邏輯單元 , 一個事務是由一個或多個完成一組的相關行為的 SQL 語句組成 , 通過事務機制確保這一組 SQL 語句所作的操作要么完全成功執(zhí)行 , 完成整個工作單元操作 , 要么一點也不執(zhí)行。 事務具有ACID特性(即:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)),ACID的概念在ISO/IEC 10026-1:1992文件的第四段內有所說明(我找了半天也沒下載到這個標準,誰有的送我一份啊,呵呵)。 2、我機器的Oracle版本為10g,10g對應的jdbc版本為3。看一下JDBC3有關事務概念: JDBC3提到了事務和分布式事務。對于大家經常說的嵌套事務,沒有提及。數(shù)據(jù)庫本質上從來沒有過嵌套事務的概念,只是應用程序為了不同的目的將對事務的操作過程嵌套起來,即使是Oracle的自治事務也可劃為應用程序(存儲過程或是觸發(fā)器什么的), 從應用角度講,嵌套事務處理就是應用程序如何將應用層面的嵌套轉變?yōu)閿?shù)據(jù)庫層面的單事務操作, 這方面Java領域的EJB,Spring提供了解決方案,另外提一下JTA,它提供了事務的suspend,resume功能,實質上其實數(shù)據(jù)庫事務那里有什么掛起什么的概念,其僅僅是換了一個數(shù)據(jù)庫連接,這樣新的數(shù)據(jù)庫事務開始了,老的數(shù)據(jù)庫事務便不再操作,直接其被resume。)。 那么接下來我們看看JDBC3中對事務的定義: Transactions are used to provide data integrity, correct application semantics, and a consistent view of data during concurrent access. All JDBC compliant drivers are required to provide transaction support. Transaction management in the JDBC API mirrors the SQL99 specification and includes these concepts: 三、解決方法 要想解決一個問題,找到問題的關鍵所在,就等于成功了一半。如上所述,該問題的關鍵所在又是什么呢? Oracle在執(zhí)行ddl語句時會先執(zhí)行commit,所以就不能對DDL語句進行回滾。jdbc事務也不提供相關方法來進行回滾(spring、ejb或許可以,但沒測試過,不好說)。 既然應用的一些框架不能提供該功能,就只能自己想辦法解決了,怎么解決?反向操作!或許感覺有些麻煩,但不這么做又如何呢,在操作SQL語句成功后,后邊跟著反向操作的定義(內部類派上用場了),在一個大的事務中,如果出現(xiàn)異常,在異常的地方把反向操作執(zhí)行一把即可。再進一步,如果讓所有的DDL語句能和DML語句用不同的數(shù)據(jù)庫連接,那么DML語句就不用反向操作了,節(jié)省了很多工作量,DML語句用事務的回滾多好啊!當然這樣做的前提是,在DDL執(zhí)行時,不能和DML操作的資源引起沖突,即鎖的問題。 本文出自:億恩科技【m.jfb888.cn】 |
京公網安備41019702002023號