JDBC的數(shù)據(jù)庫事務(wù)
事務(wù)是工作中的基本邏輯單位。數(shù)據(jù)庫的主要責(zé)任是保存信息,因此它需要向用戶提供保存當(dāng)前程序狀態(tài)的方法。同樣,當(dāng)事務(wù)執(zhí)行過程中發(fā)生錯誤時,需要有一種方法使數(shù)據(jù)庫忽略當(dāng)前的狀態(tài),并回到前面保存的程序狀態(tài)。這兩種情況在數(shù)據(jù)庫用語中分別稱為提交事務(wù)和回滾事務(wù)。為了處理這兩種情況,JDBC API 包括了兩個方法commit()和rollback(),分別用于實現(xiàn)事務(wù)的提交和回滾。在使用這兩個方法時通常要使用try ... catch語句捕獲數(shù)據(jù)庫實際運(yùn)行操作時可能發(fā)生的SQLException。
當(dāng)多個用戶訪問相同的數(shù)據(jù)時,可能會出現(xiàn)3種問題:
? 臟讀如果一個應(yīng)用程序使用了被另一個應(yīng)用程序修改過的數(shù)據(jù),而這個數(shù)據(jù)處于未提交狀態(tài),這時就會發(fā)生臟讀。第二個應(yīng)用程序隨后會請求回滾被其修改的數(shù)據(jù),從而導(dǎo)致第一個事務(wù)使用的數(shù)據(jù)被損壞,即所謂"變臟"。
? 不可重復(fù)的讀如果一個事務(wù)獲得了數(shù)據(jù),而該數(shù)據(jù)隨后被另一個事務(wù)所更改,那么第一個事務(wù)再次讀取更改后的數(shù)據(jù),就會發(fā)生不可重復(fù)的讀。
? 虛讀如果一個事務(wù)通過某種查詢獲取了數(shù)據(jù),另一個事務(wù)修改了該數(shù)據(jù)的一部分,那么原來的事務(wù)第二次獲取該數(shù)據(jù)時,就會發(fā)生虛讀。
為了解決這些由于多個用戶請求相同數(shù)據(jù)而引起的問題,事務(wù)之間必須用鎖相互隔開。多數(shù)主流的數(shù)據(jù)庫支持不同類型的鎖;因此,JDBC API支持不同類型的事務(wù),它們由 Connection對象的setTransactionLevel方法指定。在JDBC API中可以獲得下列事務(wù)級別:
? TRANSACTION_NONE 說明不支持事務(wù)。
? TRANSACTION_READ_UNCOMMITTED 說明一個事務(wù)在提交前其變化對于其他事務(wù)來說是可見的。這樣臟讀、不可重復(fù)的讀和虛讀都是允許的。
? TRANSACTION_READ_COMMITTED 說明讀取未提交的數(shù)據(jù)是不允許的。這個級別仍然允許不可重復(fù)的讀和虛讀產(chǎn)生。
? TRANSACTION_REPEATABLE_READ 說明事務(wù)保證能夠再次讀取相同的數(shù)據(jù)而不會失敗,但虛讀仍然會出現(xiàn)。
? TRANSACTION_SERIALIZABLE 是最高的事務(wù)級別,它防止臟讀、不可重復(fù)的讀和虛讀。
運(yùn)行在TRANSACTION_SERIALIZABLE模式下的事務(wù)可以保證最高程度的數(shù)據(jù)完整性,但事務(wù)保護(hù)的級別越高,性能損失就越大。
假設(shè)我們現(xiàn)在有一個Connection對象con,那么設(shè)置事務(wù)級別的方法如下:
con.setTransactionLevel(TRANSACTION_SERIALIZABLE) ;
你也可以使用getTransactionLevel()方法來獲取當(dāng)前事務(wù)的級別:
con.getTransactionLevel();
在默認(rèn)情況下,JDBC驅(qū)動程序運(yùn)行在"自動提交"模式下,即發(fā)送到數(shù)據(jù)庫的所有命令運(yùn)行在它們自己的事務(wù)中。這樣做雖然方便,但付出的代價是程序運(yùn)行時的開銷比較大。我們可以利用批處理操作減小這種開銷,因為在一次批處理操作中可以執(zhí)行多個數(shù)據(jù)庫更新操作。但批處理操作要求事務(wù)不能處于自動提交模式下。為此,我們首先要禁用自動提交模式。
executeBatch()方法返回一個更新計數(shù)的數(shù)組,每個值對應(yīng)于批處理操作中的一個命令。批處理操作可能會拋出一個類型為BatchUpdateException的異常,這個異常表明批處理操作中至少有一條命令失敗了。(T111)
posted on 2009-08-11 13:06 肥仔 閱讀(247) 評論(0) 編輯 收藏 引用 所屬分類: Web-后臺