一:什麼是JAVA事務?
通常的觀念認爲,事務僅與數據庫相關.
事務必須服從ISO/IEC所指定的ACID原則.ACID是原子性(Atomicity),一致性(Consistency),隔離性(Isolation)和持久性(Durabillty)的縮寫.
事物的原子性:表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效.
一致性:表示當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行之前的狀態.
隔離性:表示在事務執行過程中對數據的修改,在事務沒有提交之前對其他事務是不可見的
持久性:表示已經提交的數據在事務執行失敗時,數據的狀態都應該正確.
通俗的理解:事務是一組原子操作單元,從數據庫角度說,就是一組SQL指令,要麼全部執行成功,若因爲某個原因其中一條指令執行錯誤,則撤銷先前執行過的所有命令.更簡單的說,就是要麼全部執行成功,要麼全部撤銷不執行.
既然事務的概念是從數據庫而來,那麼JAVA的事務是什麼?之間有什麼聯繫呢?
實際上,一個JAVA應用系統,如果要操作數據庫,則通過JDBC來實現,增加,刪除,修改都是通過相應方法間接來實現的,事務控制也相應專一到了JAVA的程序代碼上,所以說,數據庫操作的事務也習慣上就成爲JAVA事務了.
二:爲什麼需要事務?
事務是爲解決數據安全操作提出的,事務控制實際上就是控制數據的安全訪問.舉一個簡單的例子,比如銀行轉賬業務,賬戶A要將自己賬戶上的1000元轉到B賬戶下面,A賬戶餘額首先要減去1000,然後B賬戶要增加1000,加入在中間網絡出現了問題,A賬戶減去1000元已經結束,B因爲網絡中斷而操作失敗,那麼整個業務失敗.如果沒有事務,那麼客戶將損失1000塊,所以必須做出控制,要求A賬戶轉賬業務撤銷.這才能保證業務的正確性,完成這個操作就需要事務來控制.將A賬戶資金減少和B賬戶資金增加放到一個事物裏面,要麼全部成功,要麼撤銷全部操作.這樣,就保證了數據的安全性.
三:JAVA事務的類型
JAVA的事務類型有三種.JDBC事務.JTA(JAVA Transaction Api)事務,容器事務
1.jdbc事務:是Connection對象控制的.JDBC Connection接口提供了兩種事務模式:自動提交和手動提交,JAVA.SQL.Conection提供了以下控制事務的方法
public void setAutoConmmit(boolean)
public boolean getAutoCommit()
public void commit();
public void roolback();
使用JDBC事務界定時,你可以將多個SQL語句結合到一個事物當中.JDBC事務的一個缺點就是事務的範圍侷限於一個數據庫連接.
2.JTA事務
JTA是一種高層的,與實現無關的.與協議無關的api,應用程序和應用服務器可以使用JTA來訪問事務.
JTA允許應用程序執行分佈式事務處理,在兩個或多個網絡計算機資源上訪問並且更新數據,這些數據可以分佈在多個數據庫上.JDBC驅動程序的JTA支持極大地增強了數據訪問能力
如果計劃用JTA界定事務,那麼就需要一個實現.JAVAX.sql.XADataSource;javax.sql.XAResource接口的JDBC驅動程序.一個實現了這些接口的驅動程序將可以參與JTA事務.一個XADataSource對象就是一個XAConnection對象的工廠.XAConnections是參與JTA事務的JDBC鏈接
將需要用應用服務器的管理工具設置 XADataSource 。從應用服務器和 JDBC 驅動程序的文檔中可以瞭解到相關的指導。
XA 連接與非 XA 連接不同。一定要記住 XA 連接參與了 JTA 事務。這意味着 XA 連接不支持 JDBC 的自動提交功能。同時,應用程序一定不要對 XA 連接調用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback() 。相反,應用程序應該使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() 。
3.容器事務
容器事務主要是J2EE應用服務器提供的,容器事務大多是基於JTA完成,這是一個基於JNDI的,相當複雜的API實現.相對編碼實現事務管理,我們可以通過EJB容易提供的容器事務管理機制CMT完成同一個功能.這項功能由J2EE應用服務器提供.
四:三種事務差異
1.JDBC事務控制的侷限性在一個數據庫連接內,但是使用簡單.
2,JTA事務的功能強大,事務可以跨越多個數據庫或者多個DAO.使用也比較複雜.
3.容器事務,主要指的是J2EE應用服務器提供的事務管理.侷限於EJB的應用使用
五:總結
事務控制是構建J2EE應用不可缺少的一部分.合理選擇應用何種事務對整個應用系統來說至關重要,一般來說,在單個JDBC鏈接的情況下可以選擇JDBC事務,在跨多個鏈接或者數據庫的情況下,需要選擇使用JTA事務,如果用到了EJB則可以考慮使用EJB容器的事務