JDBC事務和JTA (XA)事務(轉http://acme1921209.javaeye.com/blog/67691)

JDBC事務和JTA (XA)事務

事務簡介

  一般情況下,J2EE應用服務器支持JDBC事務、JTA(Java Transaction API)事務(一般由容器來進行管理)。通常,最好不要在程序中同時使用上述三種事務類型,比如在JTA事務中嵌套JDBC事務。第二方面,事務要在儘可能短的時間內完成,不要在不同方法中實現事務的使用(事務的嵌套要求更加良好的設計)。

JDBC事務

  在JDBC中怎樣將多個SQL語句組合成一個事務呢?在JDBC中,打開一個連接對象Connection時,缺省是auto-commit模式,每個SQL語句都被當作一個事務,即每次執行一個語句,都會自動的得到事務確認。爲了能將多個SQL語句組合成一個事務,要將auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之後,如果不調用commit()方法,SQL語句不會得到事務確認。在最近一次commit()方法調用之後的所有SQL會在方法commit()調用時得到確認。例如下面的代碼:
/**
* 測試Jboss中的JDBC事務
*

@author javer QQ:84831612


* @date 2005
*/
jjava.sql.Connection conn = null;
try{
javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/OracleDS");
conn = ds.getConnection();
conn.setAutoCommit(false);
java.sql.Statement statement = conn.createStatement();
/**
*
* 數據庫操作
*
*/
conn.commit();
} catch (Exception e) {
if(conn!=null)
try{conn.rollback();}catch(Exception e1){out.println("catch:事務回滾失敗!
");}
out.println("catch:" + e.getClass() + ";" + e.getMessage()+"
");
}finally{
if(conn!=null)
try{conn.close();}catch(Exception e1){out.println("finally:關閉數據庫連接失敗!
");}
}
  畢竟JDBC事務大多數程序員可能經常使用,而且比較相對簡單,就不作過多的描述了

 

JTA (XA)事務

  Java 事務 API(JTA) 及其同門兄弟 Java 事務服務(Java Transaction Service JTS)爲 J2EE 平臺提供了分佈式事務服務。一個分佈式的事務涉及一個事務管理器和一個或者多個資源管理器。一個資源管理器是任何類型的持久性的數據存儲。事務管理器負責協調所有事務參與者之間的通信。
  與本地事務相比,XA 協議的系統開銷相當大,因而應當慎重考慮是否確實需要分佈式事務。只有支持 XA 協議的資源才能參與分佈式事務。如果事務須登記一個以上的資源,則需要實現和配置所涉及的資源(適配器、JMS 或 JDBC 連接池)以支持 XA。

JTA事務工作流程

  WEB服務器(比如:WebLogic Server)將根據以下條件返回不同種類的包裝器:

    1所使用的 JDBC 驅動程序類是否支持 XA
    2、是從 DataSource 還是從 TxDataSource 獲得連接
    3、調用 getConnection() 時是否在事務內運行
    4、是否通過 RMI 從遠程獲得連接

  決定返回哪種包裝器的算法的工作方式如下:

JTA實例代碼

/**
* 測試Jboss中的JTA事務
*

@author javer QQ:84831612


* @date 2005
*/
javax.transaction.UserTransaction tx = null;
java.sql.Connection conn = null;
try{
tx = (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction");  //取得JTA事務,本例中是由Jboss容器管理
javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/XAOracleDS");  //取得數據庫連接池,必須有支持XA的數據庫、驅動程序
tx.begin();
conn = ds.getConnection();
//conn.setAutoCommit(false);
java.sql.Statement statement = conn.createStatement();
String sql = "insert into testtable (cell1,cell2,cell3,cell4) values('"+System.currentTimeMillis()+"','','','')";
int insert = statement.executeUpdate(sql);
//conn.commit();  //JTA事務中不要嵌套JDBC事務啦!!!重要,切記,否則會拋出異常!!!
out.println("插入了" + insert + "行記錄!
");
if(true)throw new Exception("故意拋出的異常!");
int num = statement.executeUpdate("delete testtable");
out.println("刪除了" + num + "行記錄!
");
tx.commit();
} catch (Exception e) {
if(tx!=null)
try{tx.rollback();}catch(Exception e1){out.println("catch:事務回滾失敗!
");}
out.println("catch:" + e.getClass() + ";" + e.getMessage()+"
");
}finally{
if(conn!=null)
try{conn.close();}catch(Exception e1){out.println("finally:關閉數據庫連接失敗!
");}
}

 

 ===========原文:http://blog.csdn.net/muzijie927/archive/2006/10/27/1353307.aspx

發佈了153 篇原創文章 · 獲贊 5 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章