事務是工作中的基本邏輯單位。數據庫的主要責任是保存信息,因此它需要向用戶提供保存當前程序狀態的方法。同樣,當事務執行過程中發生錯誤時,需要有一種方法使數據庫忽略當前的狀態,并回到前面保存的程序狀態。這兩種情況在數據庫用語中分別稱為提交事務和回滾事務。為了處理這兩種情況,JDBC API 包括了兩個方法commit()和rollback(),分別用于實現事務的提交和回滾。在使用這兩個方法時通常要使用try ... catch語句捕獲數據庫實際運行操作時可能發生的SQLException。
當多個用戶訪問相同的數據時,可能會出現3種問題:
為了解決這些由于多個用戶請求相同數據而引起的問題,事務之間必須用鎖相互隔開。多數主流的數據庫支持不同類型的鎖;因此,JDBC API支持不同類型的事務,它們由 Connection對象的setTransactionLevel方法指定。在JDBC API中可以獲得下列事務級別:
運行在TRANSACTION_SERIALIZABLE模式下的事務可以保證最高程度的數據完整性,但事務保護的級別越高,性能損失就越大。
假設我們現在有一個Connection對象con,那么設置事務級別的方法如下:
con.setTransactionLevel(TRANSACTION_SERIALIZABLE) ;
你也可以使用getTransactionLevel()方法來獲取當前事務的級別:
con.getTransactionLevel();
在默認情況下,JDBC驅動程序運行在"自動提交"模式下,即發送到數據庫的所有命令運行在它們自己的事務中。這樣做雖然方便,但付出的代價是程序運行時的開銷比較大。我們可以利用批處理操作減小這種開銷,因為在一次批處理操作中可以執行多個數據庫更新操作。但批處理操作要求事務不能處于自動提交模式下。為此,我們首先要禁用自動提交模式:
con.setAutoCommit(false);
下面是一個批處理操作的例子:
executeBatch()方法返回一個更新計數的數組,每個值對應于批處理操作中的一個命令。批處理操作可能會拋出一個類型為BatchUpdateException的異常,這個異常表明批處理操作中至少有一條命令失敗了。(T111)
本文選自飛思圖書《精通Java核心技術》