JDBC事務和JTA事務的區別 --包含spring事務 聲明式事務

1、事務概述
事務表示一個由一系列的數據庫操做組成的不可分割的邏輯單位,其中的操做要麼全作要麼全都不作。
與事務相關的操做主要有:
BEGIN TRANSACTION; 開始一個事務,方法是:begin()
COMMIT;       提交一個事務,方法是:commit()
ROLLBACK;      回滾一個事務,方法是:rollback()
PREPARE;       準備提交一個事務,方法是:prepare()
2、事務的特性(ACID)
一、原子性:同一個事務的操做要麼所有成功執行,要麼所有撤消
二、隔離性:事務的全部操做不會被其它事務干擾
三、一致性:在操做過程當中不會破壞數據的完整性
四、時效性 :事務的結果必須持久保存於介質上
3、事務處理方式
在JDBC鏈接中,使用命令聲明事務的開始、提交和取消。如前一章介紹的數據庫處理方式,它經過java.sql.Connection接口實現,能夠啓用AutoCommit。這種方式使用簡單,但性能較低。
利用JavaEE規範的JTA驅動程序。這種方式性能更好,是EJB和JMS的經常使用方式。
Java EE 的分佈式事務服務包括5個層次:事務管理器、應用服務器、資源管理器、應用程序、通訊資源管理器。
事務管理器:完成事務管理
應用服務器:爲應用提供服務
資源管理器:鏈接相應的資源
應 用程 序:須要使用事務的應用
通訊資源管理器:接收事務、傳播事務
4、JDBC和JTA事務區別
簡單的說 jta是多庫的事務 jdbc是單庫的事務
一、jdbc事務
JDBC事務由Connnection對象控制管理,也就是說,事務管理其實是在JDBC Connection中實現。事務週期限於Connection的生命週期。JDBC Connection 接口( java.sql.Connection )提供了兩種事務模式:自動提交和手工提交。
自動提交:缺省是自動提交。一條對數據庫的更新(增/刪/改)表明一項事務操做,操做成功後,系統將自動調用commit()來提交,不然將調用rollback()來回滾。
手工提交:經過調用setAutoCommit(false)來禁止自動提交。這樣就可把多個數據庫操做的表達式做爲一個事務,在操做完成後調 用commit()來進行總體提交,其中任何一個操做失敗,都不會執行到commit(),併產生異常;此時可在異常捕獲時調用rollback()進行回滾,以保持屢次更新操做後,相關數據的一致性,示例以下:
try {
    conn =DriverManager.getConnection(...);
    conn.setAutoCommit(false);//禁止自動提交,設置回滾點
    stmt = conn.createStatement();
    stmt.executeUpdate(...); //數據庫更新操做1
    stmt.executeUpdate(...); //數據庫更新操做2
    conn.commit(); //事務提交
}catch(Exception ex) {
    log.error(...);
    try {
        conn.rollback(); //操做不成功則回滾
    }catch(Exception e) {
        log.error(...);
    }
}
JDBC 事務的一個缺點是事務的範圍侷限於一個數據庫鏈接。一個 JDBC 事務不能跨越多個數據庫。
二、jta事務
JTA(Java Transaction API)提供了跨數據庫鏈接(或其餘JTA資源)的事務管理能力。JTA事務管理則由JTA容器實現,J2ee框架中事務管理器與應用程序,資源管理器,以及應用服務器之間的事務通信。 
1)JTA的構成
a、高層應用事務界定接口,供事務客戶界定事務邊界的
b、X/Open XA協議(資源之間的一種標準化的接口)的標準Java映射,它可使事務性的資源管理器參與由外部事務管理器控制的事務中
c、高層事務管理器接口,容許應用程序服務器爲其管理的應用程序界定事務的邊界 
2)JTA的主要接口 
位於javax.transaction包中
a、UserTransaction接口:讓應用程序得以控制事務的開始、掛起、提交、回滾等。由Java客戶端程序或EJB調用。
b、TransactionManager 接口:用於應用服務器管理事務狀態
c、Transaction接口:用於執行相關事務操做
d、XAResource接口:用於在分佈式事務環境下,協調事務管理器和資源管理器的工做
e、Xid接口:爲事務標識符的Java映射
注:前3個接口位於Java EE版的類庫 javaee.jar 中,Java SE中沒有提供!UserTransaction是編程經常使用的接口
注意的是JTA只提供了接口,沒有具體的實現。
JTS(Java Transaction Service)是服務OTS的JTA的實現。簡單的說JTS實現了JTA接口,而且符合OTS的規範。
JTA的事務週期可橫跨多個JDBC Connection生命週期,對衆多Connection進行調度,實現其事務性要求。
JTA能夠處理任何提供符合XA接口的資源。包括:JDBC鏈接,數據庫,JMS,商業對象等等。
3)JTA編程的基本步驟
a、首先配置JTA ,創建相應的數據源
b、創建事務:經過建立UserTransaction類的實例來開始一個事務。代碼以下:
  Context ctx = new InitialContext(p) ;
   UserTransaction trans = (UserTransaction) ctx.lookup("javax. Transaction.UserTransaction")
c、開始事務:代碼爲 trans.begin() ;
d、找出數據源:從Weblogic Server上找到數據源,代碼以下:
 DataSource ds = (DataSource) ctx.lookup(「mysqldb") ;
e、創建數據庫鏈接:Connection mycon = ds.getConnection() ;
f、執行SQL操做:stmt.executeUpdate(sqlS);
g、完成事務:trans.commit(); / trans.rollback();
h、關閉鏈接:mycon.close() ;java

相關文章
相關標籤/搜索