欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
JTA初級研究之JTA和JDBC事務(wù)
一般情況下,J2EE應用服務(wù)器支持JDBC事務(wù)、JTA事務(wù)、容器管理事務(wù)。這里討論JTA和JDBC事務(wù)的區別。這2個(gè)是常用的DAO模式事務(wù)界定方式。

JDBC 事務(wù)
 JDBC 事務(wù)是用 Connection 對象控制的。JDBC Connection 接口( java.sql.Connection )提供了兩種事務(wù)模式:自動(dòng)提交和手工提交。
★ 在jdbc中,事務(wù)操作缺省是自動(dòng)提交。也就是說(shuō),一條對數據庫的更新表達式代表一項事務(wù)操作,操作成功后,系統將自動(dòng)調用commit()來(lái)提交,否則將調用rollback()來(lái)回滾。
★  在jdbc中,可以通過(guò)調用setAutoCommit(false)來(lái)禁止自動(dòng)提交。之后就可以把多個(gè)數據庫操作的表達式作為一個(gè)事務(wù),在操作完成后調 用commit()來(lái)進(jìn)行整體提交,倘若其中一個(gè)表達式操作失敗,都不會(huì )執行到commit(),并且將產(chǎn)生響應的異常;此時(shí)就可以在異常捕獲時(shí)調用 rollback()進(jìn)行回滾。這樣做可以保持多次更新操作后,相關(guān)數據的一致性,示例如下:

try {

conn = 

DriverManager.getConnection    

("jdbc:oracle:thin:@host:1521:SID","username","userpwd";

       conn.setAutoCommit(false);//禁止自動(dòng)提交,設置回滾點(diǎn)

       stmt = conn.createStatement();

stmt.executeUpdate(“alter table …”); //數據庫更新操作1

stmt.executeUpdate(“insert into table …”); //數據庫更新操作2

       conn.commit(); //事務(wù)提交

     }catch(Exception ex) {    

         ex.printStackTrace();

         try {

          conn.rollback(); //操作不成功則回滾

          }catch(Exception e) {

e.printStackTrace();

           }

}

JDBC 事務(wù)的一個(gè)缺點(diǎn)是事務(wù)的范圍局限于一個(gè)數據庫連接。一個(gè) JDBC 事務(wù)不能跨越多個(gè)數據庫。

JTA事務(wù)
 JTA(Java Transaction API) 為 J2EE 平臺提供了分布式事務(wù)服務(wù)。
 要用 JTA 進(jìn)行事務(wù)界定,應用程序要調用 javax.transaction.UserTransaction 接口中的方法。例如:
 utx.begin();
      // ...
      DataSource ds = obtainXADataSource();
      Connection conn = ds.getConnection();
      pstmt = conn.prepareStatement("UPDATE MOVIES ...");
      pstmt.setString(1, "Spinal Tap");
      pstmt.executeUpdate();
      // ...
      utx.commit();

 讓我們來(lái)關(guān)注下面的話(huà):
 “用 JTA 界定事務(wù),那么就需要有一個(gè)實(shí)現 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅動(dòng)程序。一個(gè)實(shí)現了這些接口的驅動(dòng)程序將可以參與 JTA 事務(wù)。一個(gè) XADataSource 對象就是一個(gè) XAConnection 對象的工廠(chǎng)。 XAConnection s 是參與 JTA 事務(wù)的 JDBC 連接。”
 要使用JTA事務(wù),必須使用XADataSource來(lái)產(chǎn)生數據庫連接,產(chǎn)生的連接為一個(gè)XA連接。
 XA連接(javax.sql.XAConnection)和非XA(java.sql.Connection)連接的區別在于:XA可以參與JTA的事務(wù),

Note:
Oracle, Sybase, DB2, SQL Server等大型數據庫才支持XA, 支持分布事務(wù)。
My SQL 連本地都支持不好,更別說(shuō)分布事務(wù)了。(MySQL5已支持)

JTA方式的實(shí)現過(guò)程
   用XADataSource產(chǎn)生的XAConnection它擴展了一個(gè)getXAResource()方法,事務(wù)通過(guò)這個(gè)方法把它加入到事務(wù)容器中進(jìn)行 管理.對于調用者來(lái)說(shuō),根本看不到事務(wù)是如果管理的,你只要聲明開(kāi)始事務(wù),告訴容器我下面的操作要求事務(wù)參與了,最后告訴事務(wù)說(shuō)到這兒可以提交或回滾了, 別的都是黑箱操作。
 在使用JTA之前,你必須首先實(shí)現一個(gè)Xid類(lèi)用來(lái)標識事務(wù)(在普通情況下這將由事務(wù)管理程序來(lái)處理)。Xid包含三個(gè)元素:formatID、gtrid(全局事務(wù)標識符)和bqual(分支修飾詞標識符)。
 下面的例子說(shuō)明Xid的實(shí)現:

import javax.transaction.xa.*;
public class MyXid implements Xid
{
protected int formatId;
protected byte gtrid[];
protected byte bqual[];
public MyXid()
{
}
public MyXid(int formatId, byte gtrid[], byte bqual[])
{
this.formatId = formatId;
this.gtrid = gtrid;
this.bqual = bqual;
}

 public int getFormatId()
{
return formatId;
}

 public byte[] getBranchQualifier()
{
return bqual;
}

 public byte[] getGlobalTransactionId()
{
return gtrid;
}

}

其次,你需要創(chuàng )建一個(gè)你要使用的數據庫的數據源:

public DataSource getDataSource()
throws SQLException
{
SQLServerDataSource xaDS = new
com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();
xaDS.setDataSourceName("SQLServer");
xaDS.setServerName("server");
xaDS.setPortNumber(1433);
xaDS.setSelectMethod("cursor");
return xaDS;
}


例1?這個(gè)例子是用“兩步提交協(xié)議”來(lái)提交一個(gè)事務(wù)分支:

XADataSource xaDS;
XAConnection xaCon;
XAResource xaRes;
Xid xid;
Connection con;
Statement stmt;
int ret;
xaDS = getDataSource();
xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes = xaCon.getXAResource();
con = xaCon.getConnection();
stmt = con.createStatement();
xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
try {
xaRes.start(xid, XAResource.TMNOFLAGS);
stmt.executeUpdate("insert into test_table values (100)");
xaRes.end(xid, XAResource.TMSUCCESS);
ret = xaRes.prepare(xid);
if (ret == XAResource.XA_OK) {
xaRes.commit(xid, false);
}
}
catch (XAException e) {
e.printStackTrace();
}
finally {
stmt.close();
con.close();
xaCon.close();
}
 當然,實(shí)際過(guò)程中,我們不需要寫(xiě)這些代碼,這些代碼是JTA最終的實(shí)現代碼。
關(guān)于“兩步提交協(xié)議”,可以參看下面的文章:
http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505weber/index.html

 

兩階段提交(Two-Phase-Commit)協(xié)議

首先,兩階段 提交(Two-Phase-Commit)事務(wù)的啟動(dòng)與常規的單階段提交(One-Phase-Commit)事務(wù)類(lèi)似。接著(zhù),應用程序/客 戶(hù)機對該兩階段提交(Two-Phase-Commit)操作中所涉及的所有數據庫執行其修改工作?,F在,在最終提交該事務(wù)之前,客戶(hù)機通知參與的數據庫準備提交(第 1 階段)。如果客戶(hù)機從數據庫收到一條“okay”,就發(fā)出命令向數據庫提交該事務(wù)(第 2 階段)。最后分布式事務(wù)(Distributed Transaction)結束。

本文中的例子演示了如何在 Java 中使用 JTA 實(shí)現兩階段提交(Two-Phase-Commit)協(xié)議。在該應用程序中,如果一個(gè)事務(wù)分支報告了錯誤,您就要負責進(jìn)行錯誤處理。但是“兩階段提交協(xié)議 簡(jiǎn)介”小節中提到仍然存在一個(gè)問(wèn)題,那就是如果第 2 階段中一個(gè)事務(wù)分支發(fā)生故障,該怎么辦呢?

如果再次查看程序代碼,您可以看到在“第 1 階段”和“第 2 階段”之間有一個(gè)很小的時(shí)間間隔。在這一時(shí)間間隔中,出于某種理由,其中某一參與數據庫可能崩潰。如果發(fā)生了,我們將陷入分布式事務(wù)已經(jīng)部分提交的情形中。

假 定下列情形:在“第 1 階段”之后,您從 DB2 和 IDS 數據庫中都收到了“okay”。在下一步中,應用程序成功提交了 DB2 的事務(wù)分支。接著(zhù),應用程序通知 DB2 事務(wù)分支提交事務(wù)?,F在,在應用程序可以通知 IDS 事務(wù)分支提交它這一部分之前,IDS 引擎由于斷電發(fā)生崩潰。這就是一種部分提交全局事務(wù)的情形。您現在該怎么辦呢?

在重啟之后,DB2 和 IDS 都將嘗試恢復打開(kāi)的事務(wù)分支。該引擎等待來(lái)自應用程序的提示如何做。如果應用程序沒(méi)有準備重新發(fā)送“第 2 階段”的提交,該事務(wù)分支將被引擎所啟動(dòng)的試探性回滾中止。這是非常糟糕的,因為這將使該全局事務(wù)處于不一致?tīng)顟B(tài)。

一種解決方案是用一個(gè)小型應用程序連接引擎中打開(kāi)的事務(wù)分支,并通知引擎提交或回滾這一打開(kāi)的事務(wù)。如果您使用 IDS 作為后端,那么還有一個(gè)隱藏的 onmode 標志,允許您結束打開(kāi)的事務(wù)分支。(onmode -Z xid)。

在 DB2 UDB 中,您可以發(fā)出 LIST INDOUBT TRANSACTIONS 來(lái)獲得打開(kāi)的 XA 事務(wù)的有關(guān)信息。您必須查看 DB2 Information Center 中的描述來(lái)解決該問(wèn)題。

上面描述的情形是一個(gè)很好的例子,也是使用應用程序服務(wù)器(Application Server)或事務(wù)監控器(Transaction Monitor)的理由。在使用一個(gè)中間層服務(wù)器時(shí),就由該服務(wù)器負責保持事情正常。


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
分布式事務(wù)
Java中的事務(wù)
mysql 對XA事務(wù)的支持
一個(gè)注解搞定分布式事務(wù)
高級 DAO 編程
事務(wù)管理 Transaction Management
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久