国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 全面解析JTA 深度歷險

全面解析JTA 深度歷險

2021-01-03 14:45mengwei Java教程

本文介紹了利用 JTA 深度歷險的相關內(nèi)容,充分舉例說明JTA的原理和事務處理等相關內(nèi)容,十分詳細,需要的朋友可以參考下。

什么是事務處理

事務是計算機應用中不可或缺的組件模型,它保證了用戶操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔離性 ( Isolation ) 和持久性 ( Durabilily )。關于事務最經(jīng)典的示例莫過于信用卡轉賬:將用戶 A 賬戶中的 500 元人民幣轉移到用戶 B 的賬戶中,其操作流程如下 :

1. 將 A 賬戶中的金額減少 500

2. 將 B 賬戶中的金額增加 500

這兩個操作必須保正 ACID 的事務屬性:即要么全部成功,要么全部失敗;假若沒有事務保障,用戶的賬號金額將可能發(fā)生問題:

假如第一步操作成功而第二步失敗,那么用戶 A 賬戶中的金額將就減少 500 元而用戶 B 的賬號卻沒有任何增加(不翼而飛);同樣如果第一步出錯 而第二步成功,那么用戶 A 的賬戶金額不變而用戶 B 的賬號將增加 500 元(憑空而生)。上述任何一種錯誤都會產(chǎn)生嚴重的數(shù)據(jù)不一致問題,事務的缺失對于一個穩(wěn)定的生產(chǎn)系統(tǒng)是不可接受的。
J2EE 事務處理方式

1. 本地事務:緊密依賴于底層資源管理器(例如數(shù)據(jù)庫連接 ),事務處理局限在當前事務資源內(nèi)。此種事務處理方式不存在對應用服務器的依賴,因而部署靈活卻無法支持多數(shù)據(jù)源的分布式事務。在數(shù)據(jù)庫連接中使用本地事務示例如下:

清單 1. 本地事務處理實例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public void transferAccount() {
    Connection conn = null;
    Statement stmt = null;
    try{
      conn = getDataSource().getConnection();
      // 將自動提交設置為 false,
      //若設置為 true 則數(shù)據(jù)庫將會把每一次數(shù)據(jù)更新認定為一個事務并自動提交
      conn.setAutoCommit(false);
      stmt = conn.createStatement();
      // 將 A 賬戶中的金額減少 500
      stmt.execute("\
      update t_account set amount = amount - 500 where account_id = 'A'");
      // 將 B 賬戶中的金額增加 500
      stmt.execute("\
      update t_account set amount = amount + 500 where account_id = 'B'");
      // 提交事務
      conn.commit();
      // 事務提交:轉賬的兩步操作同時成功
    } catch(SQLException sqle){     
      try{
        // 發(fā)生異常,回滾在本事務中的操做
        conn.rollback();
        // 事務回滾:轉賬的兩步操作完全撤銷
        stmt.close();
        conn.close();
      }catch(Exception ignore){
      }
      sqle.printStackTrace();
    }
  }

2. 分布式事務處理 : Java 事務編程接口(JTA:Java Transaction API)和 Java 事務服務 (JTS;Java Transaction Service) 為 J2EE 平臺提供了分布式事務服務。分布式事務(Distributed Transaction)包括事務管理器(Transaction Manager)和一個或多個支持 XA 協(xié)議的資源管理器 ( Resource Manager )。我們可以將資源管理器看做任意類型的持久化數(shù)據(jù)存儲;事務管理器承擔著所有事務參與單元的協(xié)調與控制。JTA 事務有效的屏蔽了底層事務資源,使應用可以以透明的方式參入到事務處理中;但是與本地事務相比,XA 協(xié)議的系統(tǒng)開銷大,在系統(tǒng)開發(fā)過程中應慎重考慮是否確實需要分布式事務。若確實需要分布式事務以協(xié)調多個事務資源,則應實現(xiàn)和配置所支持 XA 協(xié)議的事務資源,如 JMS、JDBC 數(shù)據(jù)庫連接池等。使用 JTA 處理事務的示例如下(注意:connA 和 connB 是來自不同數(shù)據(jù)庫的連接)

清單 2. JTA 事務處理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public void transferAccount() {
    UserTransaction userTx = null;
    Connection connA = null;
    Statement stmtA = null;
    Connection connB = null;
    Statement stmtB = null;  
    try{
       // 獲得 Transaction 管理對象
      userTx = (UserTransaction)getContext().lookup("\
         java:comp/UserTransaction");
      // 從數(shù)據(jù)庫 A 中取得數(shù)據(jù)庫連接
      connA = getDataSourceA().getConnection();     
      // 從數(shù)據(jù)庫 B 中取得數(shù)據(jù)庫連接
      connB = getDataSourceB().getConnection();
            // 啟動事務
      userTx.begin();
      // 將 A 賬戶中的金額減少 500
      stmtA = connA.createStatement();
      stmtA.execute("
      update t_account set amount = amount - 500 where account_id = 'A'");
      // 將 B 賬戶中的金額增加 500
      stmtB = connB.createStatement();
      stmtB.execute("\
      update t_account set amount = amount + 500 where account_id = 'B'");
      // 提交事務
      userTx.commit();
      // 事務提交:轉賬的兩步操作同時成功(數(shù)據(jù)庫 A 和數(shù)據(jù)庫 B 中的數(shù)據(jù)被同時更新)
    } catch(SQLException sqle){
      try{
         // 發(fā)生異常,回滾在本事務中的操縱
         userTx.rollback();
        // 事務回滾:轉賬的兩步操作完全撤銷
        //( 數(shù)據(jù)庫 A 和數(shù)據(jù)庫 B 中的數(shù)據(jù)更新被同時撤銷)
        stmt.close();
        conn.close();
        ...
      }catch(Exception ignore){
      }
      sqle.printStackTrace();
    } catch(Exception ne){
      e.printStackTrace();
    }
  }

JTA 實現(xiàn)原理

很多開發(fā)人員都會對 JTA 的內(nèi)部工作機制感興趣:我編寫的代碼沒有任何與事務資源(如數(shù)據(jù)庫連接)互動的代碼,但是我的操作(數(shù)據(jù)庫更新)卻實實在在的被包含在了事務中,那 JTA 究竟是通過何種方式來實現(xiàn)這種透明性的呢? 要理解 JTA 的實現(xiàn)原理首先需要了解其架構:它包括事務管理器(Transaction Manager)和一個或多個支持 XA 協(xié)議的資源管理器 ( Resource Manager ) 兩部分, 我們可以將資源管理器看做任意類型的持久化數(shù)據(jù)存儲;事務管理器則承擔著所有事務參與單元的協(xié)調與控制。 根據(jù)所面向對象的不同,我們可以將 JTA 的事務管理器和資源管理器理解為兩個方面:面向開發(fā)人員的使用接口(事務管理器)和面向服務提供商的實現(xiàn)接口(資源管理器)。其中開發(fā)接口的主要部分即為上述示例中引用的 UserTransaction 對象,開發(fā)人員通過此接口在信息系統(tǒng)中實現(xiàn)分布式事務;而實現(xiàn)接口則用來規(guī)范提供商(如數(shù)據(jù)庫連接提供商)所提供的事務服務,它約定了事務的資源管理功能,使得 JTA 可以在異構事務資源之間執(zhí)行協(xié)同溝通。以數(shù)據(jù)庫為例,IBM 公司提供了實現(xiàn)分布式事務的數(shù)據(jù)庫驅動程序,Oracle 也提供了實現(xiàn)分布式事務的數(shù)據(jù)庫驅動程序, 在同時使用 DB2 和 Oracle 兩種數(shù)據(jù)庫連接時, JTA 即可以根據(jù)約定的接口協(xié)調者兩種事務資源從而實現(xiàn)分布式事務。正是基于統(tǒng)一規(guī)范的不同實現(xiàn)使得 JTA 可以協(xié)調與控制不同數(shù)據(jù)庫或者 JMS 廠商的事務資源。

開發(fā)人員使用開發(fā)人員接口,實現(xiàn)應用程序對全局事務的支持;各提供商(數(shù)據(jù)庫,JMS 等)依據(jù)提供商接口的規(guī)范提供事務資源管理功能;事務管理器( TransactionManager )將應用對分布式事務的使用映射到實際的事務資源并在事務資源間進行協(xié)調與控制。 下面,本文將對包括 UserTransaction、Transaction 和 TransactionManager 在內(nèi)的三個主要接口以及其定義的方法進行介紹。

面向開發(fā)人員的接口為 UserTransaction (使用方法如上例所示),開發(fā)人員通常只使用此接口實現(xiàn) JTA 事務管理,其定義了如下的方法:

begin()- 開始一個分布式事務,(在后臺 TransactionManager 會創(chuàng)建一個 Transaction 事務對象并把此對象通過 ThreadLocale 關聯(lián)到當前線程上 )

commit()- 提交事務(在后臺 TransactionManager 會從當前線程下取出事務對象并把此對象所代表的事務提交)

rollback()- 回滾事務(在后臺 TransactionManager 會從當前線程下取出事務對象并把此對象所代表的事務回滾)

getStatus()- 返回關聯(lián)到當前線程的分布式事務的狀態(tài) (Status 對象里邊定義了所有的事務狀態(tài),感興趣的讀者可以參考 API 文檔 )

setRollbackOnly()- 標識關聯(lián)到當前線程的分布式事務將被回滾

面向提供商的實現(xiàn)接口主要涉及到 TransactionManager 和 Transaction 兩個對象

Transaction 代表了一個物理意義上的事務,在開發(fā)人員調用 UserTransaction.begin() 方法時 TransactionManager 會創(chuàng)建一個 Transaction 事務對象(標志著事務的開始)并把此對象通過 ThreadLocale 關聯(lián)到當前線程。UserTransaction 接口中的 commit()、rollback(),getStatus() 等方法都將最終委托給 Transaction 類的對應方法執(zhí)行。Transaction 接口定義了如下的方法:

commit()- 協(xié)調不同的事務資源共同完成事務的提交

rollback()- 協(xié)調不同的事務資源共同完成事務的回滾

setRollbackOnly()- 標識關聯(lián)到當前線程的分布式事務將被回滾

getStatus()- 返回關聯(lián)到當前線程的分布式事務的狀態(tài)

enListResource(XAResource xaRes, int flag)- 將事務資源加入到當前的事務中(在上述示例中,在對數(shù)據(jù)庫 A 操作時 其所代表的事務資源將被關聯(lián)到當前事務中,同樣,在對數(shù)據(jù)庫 B 操作時其所代表的事務資源也將被關聯(lián)到當前事務中)
delistResourc(XAResource xaRes, int flag)- 將事務資源從當前事務中刪除

registerSynchronization(Synchronization sync)- 回調接口,Hibernate 等 ORM 工具都有自己的事務控制機制來保證事務, 但同時它們還需要一種回調機制以便在事務完成時得到通知從而觸發(fā)一些處理工作,如清除緩存等。這就涉及到了 Transaction 的回調接口 registerSynchronization。工具可以通過此接口將回調程序注入到事務中,當事務成功提交后,回調程序將被激活。

TransactionManager 本身并不承擔實際的事務處理功能,它更多的是充當用戶接口和實現(xiàn)接口之間的橋梁。下面列出了 TransactionManager 中定義的方法,可以看到此接口中的大部分事務方法與 UserTransaction 和 Transaction 相同。 在開發(fā)人員調用 UserTransaction.begin() 方法時 TransactionManager 會創(chuàng)建一個 Transaction 事務對象(標志著事務的開始)并把此對象通過 ThreadLocale 關聯(lián)到當前線程上;同樣 UserTransaction.commit() 會調用 TransactionManager.commit(), 方法將從當前線程下取出事務對象 Transaction 并把此對象所代表的事務提交, 即調用 Transaction.commit()

begin()- 開始事務

commit()- 提交事務

rollback()- 回滾事務

getStatus()- 返回當前事務狀態(tài)

setRollbackOnly()

getTransaction()- 返回關聯(lián)到當前線程的事務

setTransactionTimeout(int seconds)- 設置事務超時時間

resume(Transaction tobj)- 繼續(xù)當前線程關聯(lián)的事務

suspend()- 掛起當前線程關聯(lián)的事務

在系統(tǒng)開發(fā)過程中會遇到需要將事務資源暫時排除的操作,此時就需要調用 suspend() 方法將當前的事務掛起:在此方法后面所做的任何操作將不會被包括在事務中,在非事務性操作完成后調用 resume()以繼續(xù)事務(注: 要進行此操作需要獲得 TransactionManager 對象, 其獲得方式在不同的 J2EE 應用服務器上是不一樣的)。

清單 3. 開始事務 - UserTransactionImpl implenments UserTransaction

?
1
2
3
4
public void begin() throws NotSupportedException, SystemException {
  // 將開始事務的操作委托給 TransactionManagerImpl
  TransactionManagerImpl.singleton().begin();
   }

清單 4. 開始事務 - TransactionManagerImpl implements TransactionManager

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 此處 transactionHolder 用于將 Transaction 所代表的事務對象關聯(lián)到線程上
private static ThreadLocal transactionHolder
    = new ThreadLocal();
   //TransacationMananger 必須維護一個全局對象,因此使用單實例模式實現(xiàn)
   private static TransactionManagerImpl singleton = new TransactionManagerImpl();
   private TransactionManagerImpl(){ 
   }
   public static TransactionManagerImpl singleton(){
    return singleton;
   }
   public void begin() throws NotSupportedException, SystemException {
     //XidImpl 實現(xiàn)了 Xid 接口,其作用是唯一標識一個事務
     XidImpl xid = new XidImpl();
     // 創(chuàng)建事務對象,并將對象關聯(lián)到線程
     TransactionImpl tx = new TransactionImpl(xid);
     transactionHolder.set(tx);
   }

現(xiàn)在我們就可以理解 Transaction 接口上沒有定義 begin 方法的原因了:Transaction 對象本身就代表了一個事務,在它被創(chuàng)建的時候就表明事務已經(jīng)開始,因此也就不需要額外定義 begin() 方法了。

清單 5. 提交事務 - UserTransactionImpl implenments UserTransaction

?
1
2
3
4
5
6
7
8
9
10
11
12
public void commit() throws RollbackException, HeuristicMixedException,
    HeuristicRollbackException, SecurityException,
    IllegalStateException, SystemException {
    // 檢查是否是 Roll back only 事務,如果是回滾事務
      if(rollBackOnly){
      rollback();
      return;
     } else {
      // 將提交事務的操作委托給 TransactionManagerImpl
      TransactionManagerImpl.singleton().commit();
     }
}

清單 6. 提交事務 - TransactionManagerImpl implenments TransactionManager

?
1
2
3
4
5
6
7
public void commit() throws RollbackException, HeuristicMixedException,
  HeuristicRollbackException, SecurityException,
  IllegalStateException, SystemException {
   // 取得當前事務所關聯(lián)的事務并通過其 commit 方法提交
   TransactionImpl tx = transactionHolder.get();
   tx.commit();
       }

同理, rollback、getStatus、setRollbackOnly 等方法也采用了與 commit() 相同的方式實現(xiàn)。 UserTransaction 對象不會對事務進行任何控制, 所有的事務方法都是通過 TransactionManager 傳遞到實際的事務資源即 Transaction 對象上。

上述示例演示了 JTA 事務的處理過程,下面將為您展示事務資源(數(shù)據(jù)庫連接,JMS)是如何以透明的方式加入到 JTA 事務中的。首先需要明確的一點是,在 JTA 事務 代碼中獲得的數(shù)據(jù)庫源 ( DataSource ) 必須是支持分布式事務的。在如下的代碼示例中,盡管所有的數(shù)據(jù)庫操作都被包含在了 JTA 事務中,但是因為 MySql 的數(shù)據(jù)庫連接是通過本地方式獲得的,對 MySql 的任何更新將不會被自動包含在全局事務中。

清單 7. JTA 事務處理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public void transferAccount() {
    UserTransaction userTx = null;
    Connection mySqlConnection = null;
    Statement mySqlStat = null;
    Connection connB = null;
    Statement stmtB = null;
    try{
        // 獲得 Transaction 管理對象
      userTx =
      (UserTransaction)getContext().lookup("java:comp/UserTransaction");
      // 以本地方式獲得 mySql 數(shù)據(jù)庫連接
      mySqlConnection = DriverManager.getConnection("localhost:1111");
      // 從數(shù)據(jù)庫 B 中取得數(shù)據(jù)庫連接, getDataSourceB 返回應用服務器的數(shù)據(jù)源
      connB = getDataSourceB().getConnection();
            // 啟動事務
      userTx.begin();
      // 將 A 賬戶中的金額減少 500
      //mySqlConnection 是從本地獲得的數(shù)據(jù)庫連接,不會被包含在全局事務中
      mySqlStat = mySqlConnection.createStatement();
      mySqlStat.execute("
      update t_account set amount = amount - 500 where account_id = 'A'");
      //connB 是從應用服務器得的數(shù)據(jù)庫連接,會被包含在全局事務中
      stmtB = connB.createStatement();
      stmtB.execute("
      update t_account set amount = amount + 500 where account_id = 'B'");
      // 事務提交:connB 的操作被提交,mySqlConnection 的操作不會被提交
      userTx.commit();
    } catch(SQLException sqle){
      // 處理異常代碼
    } catch(Exception ne){
      e.printStackTrace();
    }
  }

為什么必須從支持事務的數(shù)據(jù)源中獲得的數(shù)據(jù)庫連接才支持分布式事務呢?其實支持事務的數(shù)據(jù)源與普通的數(shù)據(jù)源是不同的,它實現(xiàn)了額外的 XADataSource 接口。我們可以簡單的將 XADataSource 理解為普通的數(shù)據(jù)源(繼承了 java.sql.PooledConnection),只是它為支持分布式事務而增加了 getXAResource 方法。另外,由 XADataSource 返回的數(shù)據(jù)庫連接與普通連接也是不同的,此連接除了實現(xiàn) java.sql.Connection 定義的所有功能之外還實現(xiàn)了 XAConnection 接口。我們可以把 XAConnection 理解為普通的數(shù)據(jù)庫連接,它支持所有 JDBC 規(guī)范的數(shù)據(jù)庫操作,不同之處在于 XAConnection 增加了對分布式事務的支持。

應用程序從支持分布式事務的數(shù)據(jù)源獲得的數(shù)據(jù)庫連接是 XAConnection 接口的實現(xiàn),而由此數(shù)據(jù)庫連接創(chuàng)建的會話(Statement)也為了支持分布式事務而增加了功能,如下代碼所示:

清單 8. JTA 事務資源處理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void transferAccount() {
    UserTransaction userTx = null;
    Connection conn = null;
    Statement stmt = null;
    try{
        // 獲得 Transaction 管理對象
      userTx = (UserTransaction)getContext().lookup("
      java:comp/UserTransaction");
      // 從數(shù)據(jù)庫中取得數(shù)據(jù)庫連接, getDataSourceB 返回支持分布式事務的數(shù)據(jù)源
      conn = getDataSourceB().getConnection();
            // 會話 stmt 已經(jīng)為支持分布式事務進行了功能增強
      stmt = conn.createStatement();
            // 啟動事務
      userTx.begin();
      stmt.execute("update t_account ... where account_id = 'A'");
      userTx.commit();
    } catch(SQLException sqle){
      // 處理異常代碼
    } catch(Exception ne){
      e.printStackTrace();
    }
  }

我們來看一下由 XAConnection 數(shù)據(jù)庫連接創(chuàng)建的會話(Statement)部分的代碼實現(xiàn)(不同的 JTA 提供商會有不同的實現(xiàn)方式,此處代碼示例只是向您演示事務資源是如何被自動加入到事務中)。 我們以會話對象的 execute 方法為例,通過在方法開始部分增加對 associateWithTransactionIfNecessary 方法的調用,即可以保證在 JTA 事務期間,對任何數(shù)據(jù)庫連接的操作都會被透明的加入到事務中。

清單 9. 將事務資源自動關聯(lián)到事務對象 - XAStatement implements Statement

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public void execute(String sql) {
        // 對于每次數(shù)據(jù)庫操作都檢查此會話所在的數(shù)據(jù)庫連接是否已經(jīng)被加入到事務中
    associateWithTransactionIfNecessary();
    try{
           // 處理數(shù)據(jù)庫操作的代碼
       ....
    } catch(SQLException sqle){
      // 處理異常代碼
    } catch(Exception ne){
      e.printStackTrace();
    }
  }
public void associateWithTransactionIfNecessary(){
    // 獲得 TransactionManager
    TransactionManager tm = getTransactionManager();
        Transaction tx = tm.getTransaction();
      // 檢查當前線程是否有分布式事務
      if(tx != null){
      // 在分布式事務內(nèi),通過 tx 對象判斷當前數(shù)據(jù)連接是否已經(jīng)被包含在事務中,
      //如果不是那么將此連接加入到事務中
      Connection conn = this.getConnection();
      //tx.hasCurrentResource, xaConn.getDataSource() 不是標準的 JTA
            // 接口方法,是為了實現(xiàn)分布式事務而增加的自定義方法
      if(!tx.hasCurrentResource(conn)){
        XAConnection xaConn = (XAConnection)conn;
        XADataSource xaSource = xaConn.getDataSource();
        // 調用 Transaction 的接口方法,將數(shù)據(jù)庫事務資源加入到當前事務中
        tx.enListResource(xaSource.getXAResource(), 1);
        }
      }
    }

XAResource 與 Xid: XAResource 是 Distributed Transaction Processing: The XA Specification 標準的 Java 實現(xiàn),它是對底層事務資源的抽象,定義了分布式事務處理過程中事務管理器和資源管理器之間的協(xié)議,各事務資源提供商(如 JDBC 驅動,JMS)將提供此接口的實現(xiàn)。使用此接口,開發(fā)人員可以通過自己的編程實現(xiàn)分布式事務處理,但這些通常都是由應用服務器實現(xiàn)的(服務器自帶實現(xiàn)更加高效,穩(wěn)定) 為了說明,我們將舉例說明他的使用方式。

在使用分布式事務之前,為了區(qū)分事務使之不發(fā)生混淆,必須實現(xiàn)一個 Xid 類用來標識事務,可以把 Xid 想象成事務的一個標志符,每次在新事務創(chuàng)建是都會為事務分配一個 Xid,Xid 包含三個元素:formatID、gtrid(全局事務標識符)和 bqual(分支修飾詞標識符)。 formatID 通常是零,這意味著你將使用 OSI CCR(Open Systems Interconnection Commitment, Concurrency 和 Recovery 標準)來命名;如果你要使用另外一種格式,那么 formatID 應該大于零,-1 值意味著 Xid 為無效。
gtrid 和 bqual 分別包含 64 個字節(jié)二進制碼來分別標識全局事務和分支事務, 唯一的要求是 gtrid 和 bqual 必須是全局唯一的。

XAResource 接口中主要定義了如下方法:

commit()- 提交事務

isSameRM(XAResource xares)- 檢查當前的 XAResource 與參數(shù)是否同一事務資源

prepare()- 通知資源管理器準備事務的提交工作

rollback()- 通知資源管理器回滾事務

在事務被提交時,Transaction 對象會收集所有被當前事務包含的 XAResource 資源,然后調用資源的提交方法,如下代碼所示:

清單 10. 提交事務 - TransactionImpl implements Transaction

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void commit() throws RollbackException, HeuristicMixedException,
       HeuristicRollbackException, SecurityException,
       IllegalStateException, SystemException {
       // 得到當前事務中的所有事務資源
        List list = getAllEnlistedResouces();
       // 通知所有的事務資源管理器,準備提交事務
            // 對于生產(chǎn)級別的實現(xiàn),此處需要進行額外處理以處理某些資源準備過程中出現(xiàn)的異常
       for(XAResource xa : list){
         xa.prepare();
       }
       // 所有事務性資源,提交事務
       for(XAResource xa : list){
         xa.commit();
       }
    }

結束語

通過如上介紹相信讀者對 JTA 的原理已經(jīng)有所了解,本文中的示例代碼都是理想情況下的假設實現(xiàn)。一款完善成熟的 JTA 事務實現(xiàn)需要考慮與處理的細節(jié)非常多,如性能(提交事務的時候使用多線程方式并發(fā)提交事務)、容錯(網(wǎng)絡,系統(tǒng)異常)等, 其成熟也需要經(jīng)過較長時間的積累。感興趣的讀者可以閱讀一些開源 JTA 實現(xiàn)以進一步深入學習。希望本文對大家能有所幫助。

原文鏈接:https://www.2cto.com/kf/201706/646157.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产毛片毛片 | 国产艹| 91最新网站| 欧美性猛片aaaaaaa做受 | 91精品国产综合久久久久久 | 精品久久久久久久久久久久 | 国产一级毛片国语一级 | 精品久久久久久久久久久久 | 五月婷婷在线视频 | 欧美日韩国产精品一区 | 欧美中文在线 | 91精品国产色综合久久 | 亚洲精品国产精品国自产在线 | 艹逼短视频 | 国产精品视频久久久 | 一本一本久久a久久精品综合妖精 | 欧洲精品视频在线观看 | 久久久久国产精品 | 亚洲欧美激情视频 | 毛片网站免费在线观看 | 中文字幕免费看 | 日韩欧美在线一区 | 欧美国产日韩精品 | 99精品一区二区三区 | 在线不卡a资源高清 | 亚洲午夜视频 | 91视频在线| 久久国产精品99久久久久久老狼 | 欧洲一级毛片 | 亚洲精品一区二区三区蜜桃久 | a久久| 美日韩精品视频 | 99精品欧美一区二区蜜桃免费 | 1区2区视频 | 女人高潮视频网站 | 日韩一区二区电影 | 久久99久久99精品免视看婷婷 | 一级免费视频 | 一区二区三区久久久久久 | 日韩美女国产精品 | 成人在线观看日韩 |