关于Java事务原理的探讨
原文:http://lunwen.1kejian.com/jisuanjiyingyong/69287.html
摘 要:一般情況下,J2EE應用服務器支持JDBC事務、JTA(Java Transaction API)事務、EJB容器管理事務。本文將向您詳細介紹Java事務的概念、原理、類型及應用。Java事務控制是構建J2EE應用不可缺少的一部分,合理選擇應用何種事務對整個應用系統來說至關重要。
關鍵詞:Java事務;EJB;事務處理;JTA?
一、JAVA事務的概念
一般的概念認為:事務僅與數據庫相關。
在數據庫操作中,一項事務是指由一條或多條對數據庫更新的sql語句所組成的一個不可分割的工作單元。只有當事務中的所有操作都正常完成了,整個事務才能被提交到數據庫,如果有一項操作沒有完成,就必須撤消整個事務。我們通過提交commit()或是回滾rollback()來結束事務的操作。關于事務操作的方法都位于接口java.sql.Connection中。
Java事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性、一致性、隔離性和持久性的縮寫。事務的原子性表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。一致性表示當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行前的狀態。隔離性表示在事務執行過程中對數據的修改,在事務提交之前對其他事務不可見。持久性表示已提交的數據在事務執行失敗時,數據的狀態都應該正確。
通俗的理解,事務是一組原子操作單元,從數據庫角度說,就是一組SQL指令,要么全部執行成功,若因為某個原因其中一條指令執行有錯誤,則撤銷先前執行過的所有指令。更簡答的說就是:要么全部執行成功,要么撤銷不執行。
一個Java應用系統,如果要操作數據庫,則通過JDBC來實現的。增加、修改、刪除都是通過相應方法間接來實現的,事務的控制也相應轉移到Java程序代碼中。因此,數據庫操作的事務習慣上就稱為Java事務。
二、Java事務的必要性
事務是為解決數據安全操作提出的,事務控制實際上就是控制數據的安全訪問。一個簡單例子:比如銀行轉帳業務,武漢賬戶A要將自己賬戶上的800元轉到深圳B賬戶下面,A賬戶余額首先要減去800元,然后B賬戶要增加800元。該交易的偽碼表示如下:
? begin transaction?
? ? accountA := accountA - 800
? ? accountB := accountB + 800
? commit transaction
假如在中間網絡出現了問題,A賬戶減去800元已經結束,B因為網絡中斷而操作失敗,那么整個業務失敗,必須做出控制,要求A賬戶轉帳業務撤銷。這才能保證業務的正確性,完成這個操走就需要事務,將A賬戶資金減少和B賬戶資金增加方到一個事務里面,要么全部執行成功,要么操作全部撤銷,這樣就保持了數據的安全性。
事務:所有步驟要么全部完成,要么一個都不做。否則數據完整性將被破壞。因為事務中的所有步驟被看作一個統一的整體,所以事務一般被定義為一個不可分割的工作單元。
三、Java事務的類型及差異
Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。一般情況下,最好不要在程序中同時使用上述三種事務類型,比如在JTA事務中嵌套JDBC事務。第二方面,事務要在盡可能短的時間內完成,不要在不同方法中實現事務的使用
1、JDBC事務
JDBC 事務是用 Connection 對象控制的。打開一個連接對象Connection時,缺省是auto-commit模式,每個 SQL語句都被當作一個事務,即每次執行一個語句,都會自動的得到事務確認。JDBC Connection 接口(java.sql.Connection )提供了兩種事務模式:自動提交和手工提交。 java.sql.Connection 提供了以下控制事務的方法:
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
使用 JDBC 事務界定時,您可以將多個 SQL 語句結合到一個事務中。JDBC 事務的一個缺點是事務的范圍局限于一個數據庫連接。一個 JDBC 事務不能跨越多個數據庫。
2、JTA(Java Transaction API)事務
JTA是一種高層的,與實現無關的,與協議無關的API,應用程序和應用服務器可以使用JTA來訪問事務。
JTA允許應用程序執行分布式事務處理——在兩個或多個網絡計算機資源上訪問并且更新數據,這些數據可以分布在多個數據庫上。JDBC驅動程序的JTA支持極大地增強了數據訪問能力。
如果計劃用 JTA 界定事務,那么就需要有一個實現 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅動程序。一個實現了這些接口的驅動程序將可以參與 JTA 事務。一個 XADataSource 對象就是一個 XAConnection 對象的工廠。 XAConnection s 是參與 JTA 事務的 JDBC 連接。您將需要用應用服務器的管理工具設置 XADataSource .從應用服務器和 JDBC 驅動程序的文檔中可以了解到相關的指導。
J2EE應用程序用 JNDI 查詢數據源。一旦應用程序找到了數據源對象,它就調用 javax.sql.DataSource.getConnection() 以獲得到數據庫的連接。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實現。相對編碼實現JTA事務管理,我們可以通過EJB容器提供的容器事務管理機制(CMT)完成同一個功能,這項功能由J2EE應用服務器提供。這使得我們可以簡單的指定將哪個方法加入事務,一旦指定,容器將負責事務管理任務。這是我們土建的解決方式,因為通過這種方式我們可以將事務代碼排除在邏輯編碼之外,同時將所有困難交給J2EE容器去解決。使用EJB CMT的另外一個好處就是程序員無需關心JTA API的編碼,不過,理論上我們必須使用EJB.
? 4、三種Java事務差異
1、JDBC事務控制的局限性在一個數據庫連接內,但是其使用簡單。
2、JTA事務的功能強大,事務可以跨越多個數據庫或多個DAO,使用也比較復雜。
3、容器事務,主要指的是J2EE應用服務器提供的事務管理,局限于EJB應用使用。
四、總結
Java事務控制是構建J2EE應用不可缺少的一部分,合理選擇應用何種事務對整個應用系統來說至關重要。一般說來,在單個JDBC 連接連接的情況下可以選擇JDBC事務,在跨多個連接或者數據庫情況下,需要選擇使用JTA事務,如果用到了EJB,則需要考慮使用EJB容器事務。
參考文獻:
[1]齊勇,趙季中,侯迪,沈鈞毅,曾斌異. 基于Web的中間件系統集成框架—應用服務器的研究 《計算機研究與發展》, 2001.4
[2]魏學松. J2EE輕量級框架的研究與實現 《中國優秀博碩士學位論文全文數據庫 (碩士)》,2006.10
[3]鄧虎成,蔡淮,萬暢.? 基于J2EE的數據通用性操作框架的研究與實現 《成都信息工程學院學報》, 2005.2
[4]古全友.? 基于J2EE的WAP應用架構設計與開發 《北方工業大學》, 2006
總結
以上是生活随笔為你收集整理的关于Java事务原理的探讨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序申请医疗-就医服务类目解决办法
- 下一篇: Java类的继承学生研究生类图_UML