談?wù)剬?duì)Oracle處理DDL和DML語句的事務(wù)管理 |
發(fā)布時(shí)間: 2012/8/26 15:43:26 |
一、先說問題 在開發(fā)過程中,遇到了Oracle DDL語句和DML語句需要在一個(gè)事務(wù)中一塊處理的情況,該方法要么成功,要么失敗。對(duì)于這個(gè)問題,sql server等數(shù)據(jù)庫是可以解決的,因?yàn)槠淠軐?duì)DDL語句做回滾,而oracle在執(zhí)行ddl語句時(shí)會(huì)先執(zhí)行commit,所以就不能對(duì)DDL語句回滾了。 二、事務(wù)相關(guān)概念 1、 首先,說說數(shù)據(jù)庫對(duì)事務(wù)的相關(guān)定義: 在數(shù)據(jù)庫中事務(wù)是工作的邏輯單元 , 一個(gè)事務(wù)是由一個(gè)或多個(gè)完成一組的相關(guān)行為的 SQL 語句組成 , 通過事務(wù)機(jī)制確保這一組 SQL 語句所作的操作要么完全成功執(zhí)行 , 完成整個(gè)工作單元操作 , 要么一點(diǎn)也不執(zhí)行。 事務(wù)具有ACID特性(即:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨(dú)立性)、持久性(Durability)),ACID的概念在ISO/IEC 10026-1:1992文件的第四段內(nèi)有所說明(我找了半天也沒下載到這個(gè)標(biāo)準(zhǔn),誰有的送我一份啊,呵呵)。 2、我機(jī)器的Oracle版本為10g,10g對(duì)應(yīng)的jdbc版本為3?匆幌翵DBC3有關(guān)事務(wù)概念: JDBC3提到了事務(wù)和分布式事務(wù)。對(duì)于大家經(jīng)常說的嵌套事務(wù),沒有提及。數(shù)據(jù)庫本質(zhì)上從來沒有過嵌套事務(wù)的概念,只是應(yīng)用程序?yàn)榱瞬煌哪康膶?duì)事務(wù)的操作過程嵌套起來,即使是Oracle的自治事務(wù)也可劃為應(yīng)用程序(存儲(chǔ)過程或是觸發(fā)器什么的), 從應(yīng)用角度講,嵌套事務(wù)處理就是應(yīng)用程序如何將應(yīng)用層面的嵌套轉(zhuǎn)變?yōu)閿?shù)據(jù)庫層面的單事務(wù)操作, 這方面Java領(lǐng)域的EJB,Spring提供了解決方案,另外提一下JTA,它提供了事務(wù)的suspend,resume功能,實(shí)質(zhì)上其實(shí)數(shù)據(jù)庫事務(wù)那里有什么掛起什么的概念,其僅僅是換了一個(gè)數(shù)據(jù)庫連接,這樣新的數(shù)據(jù)庫事務(wù)開始了,老的數(shù)據(jù)庫事務(wù)便不再操作,直接其被resume。)。 那么接下來我們看看JDBC3中對(duì)事務(wù)的定義: 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: 三、解決方法 要想解決一個(gè)問題,找到問題的關(guān)鍵所在,就等于成功了一半。如上所述,該問題的關(guān)鍵所在又是什么呢? Oracle在執(zhí)行ddl語句時(shí)會(huì)先執(zhí)行commit,所以就不能對(duì)DDL語句進(jìn)行回滾。jdbc事務(wù)也不提供相關(guān)方法來進(jìn)行回滾(spring、ejb或許可以,但沒測(cè)試過,不好說)。 既然應(yīng)用的一些框架不能提供該功能,就只能自己想辦法解決了,怎么解決?反向操作!或許感覺有些麻煩,但不這么做又如何呢,在操作SQL語句成功后,后邊跟著反向操作的定義(內(nèi)部類派上用場了),在一個(gè)大的事務(wù)中,如果出現(xiàn)異常,在異常的地方把反向操作執(zhí)行一把即可。再進(jìn)一步,如果讓所有的DDL語句能和DML語句用不同的數(shù)據(jù)庫連接,那么DML語句就不用反向操作了,節(jié)省了很多工作量,DML語句用事務(wù)的回滾多好。‘(dāng)然這樣做的前提是,在DDL執(zhí)行時(shí),不能和DML操作的資源引起沖突,即鎖的問題。 本文出自:億恩科技【www.allwellnessguide.com】 服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |