日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)OceanBase教程:OceanBaseXA組件

XA 組件是 OceanBase Connector/J 指定的標(biāo)準(zhǔn) XA 接口。

XADatasource 接口和 Oracle 實(shí)施

javax.sql.XADataSource 接口概述了 XA 數(shù)據(jù)源的標(biāo)準(zhǔn)功能,是 XA 連接的工廠。getXAConnection 方法重載返回一個(gè) XA 連接實(shí)例,并可以選擇使用用戶名和密碼作為輸入,如下所示:


public interface XADataSource
{
   XAConnection getXAConnection() throws SQLException;
   XAConnection getXAConnection(String user, String password)
      throws SQLException;
   ...
}

OceanBase Connector/J 使用 OracleXADataSource 類(lèi)實(shí)現(xiàn) XADataSource 接口。OracleXADataSource 類(lèi)還擴(kuò)展了 OracleConnectionPoolDataSource 類(lèi),而 OracleConnectionPoolDataSource 類(lèi)擴(kuò)展了 OracleDataSource 類(lèi),因此包括所有連接屬性。

OracleXADataSource 類(lèi)的 getXAConnection 方法返回 XA 連接實(shí)例的 Oracle 實(shí)現(xiàn),這些實(shí)例是 OracleXAConnection 實(shí)例。

說(shuō)明 
您可以使用前面討論的非池化數(shù)據(jù)源相同的命名約定在 Java 命名目錄和接口(JNDI)中注冊(cè) XA 數(shù)據(jù)源。

XAConnection 接口和 Oracle 實(shí)施

XA 連接實(shí)例與池連接實(shí)例一樣,封裝了與數(shù)據(jù)庫(kù)的物理連接。 這里的數(shù)據(jù)庫(kù)是指在產(chǎn)生 XA 連接實(shí)例的 XA 數(shù)據(jù)源實(shí)例的連接屬性中指定的數(shù)據(jù)庫(kù)。

每個(gè) XA 連接實(shí)例還具有生成 OracleXAResource 實(shí)例的功能,該實(shí)例將與之相對(duì)應(yīng)以用于協(xié)調(diào)分布式事務(wù)。

XA 連接實(shí)例是實(shí)現(xiàn)標(biāo)準(zhǔn) javax.sql.XAConnection 接口類(lèi)的實(shí)例,如下所示:


public interface XAConnection extends PooledConnection
{
   javax.jta.xa.XAResource getXAResource() throws SQLException;
}

XAConnection 接口擴(kuò)展了 javax.sql.PooledConnection 接口,因此還包括 getConnectionclose、addConnectionEventListener 和 removeConnectionEventListener 方法。

JDBC 使用 OracleXAConnection 類(lèi)實(shí)現(xiàn) XAConnection 接口,OracleXAConnection 類(lèi)還擴(kuò)展了 OraclePooledConnection 類(lèi)。

OracleXAConnection 類(lèi)的 getXAResource 方法返回 OracleXAResource 實(shí)例的 Oracle 實(shí)現(xiàn),該實(shí)例是一個(gè)OracleXAResource 實(shí)例。getConnection 方法返回一個(gè) OracleConnection 實(shí)例。

XA 連接實(shí)例返回的 OceanBase Connector/J 連接實(shí)例充當(dāng)物理連接的臨時(shí)句柄,而不是封裝物理連接。物理連接由 XA 連接實(shí)例封裝。與常規(guī)連接完全相同,連接從 XAConnection 對(duì)象獲得連接的行為,直至參與到全局事務(wù)為止。這時(shí),自動(dòng)提交狀態(tài)設(shè)置為 false。全局事務(wù)結(jié)束后,自動(dòng)提交狀態(tài)將返回到其在全局事務(wù)之前的值。從 XAConnection 獲得的連接的默認(rèn)自動(dòng)提交狀態(tài)均為 true。

每次調(diào)用 XA 連接實(shí)例的 getConnection 方法時(shí),都會(huì)返回一個(gè)表現(xiàn)出默認(rèn)行為的新連接實(shí)例,并關(guān)閉以前存在的并由同一 XA 連接實(shí)例返回的所有以前的連接實(shí)例。但是,建議在打開(kāi)新的連接實(shí)例之前顯式關(guān)閉先前的連接實(shí)例。

調(diào)用 XA 連接實(shí)例的 close 方法將關(guān)閉與數(shù)據(jù)庫(kù)的物理連接,并通常在中間層執(zhí)行。

XAResource 接口和 Oracle 實(shí)施

事務(wù)管理器使用 OracleXAResource 實(shí)例來(lái)協(xié)調(diào)分布式事務(wù)的所有事務(wù)分支。

每個(gè) OracleXAResource 實(shí)例都提供給事務(wù)管理器調(diào)用的關(guān)鍵功能,如下:

  • 將分布式事務(wù)與產(chǎn)生此 OracleXAResource 實(shí)例的 XA 連接實(shí)例中運(yùn)行的事務(wù)分支關(guān)聯(lián)和解除關(guān)聯(lián)。本質(zhì)上,是將分布式事務(wù)與 XA 連接實(shí)例封裝的物理連接或會(huì)話相關(guān)聯(lián)。這是通過(guò)使用事務(wù) ID 來(lái)完成的。

  • 執(zhí)行分布式事務(wù)的兩階段提交功能,以確保在所有事務(wù)分支中更改都成功之前,不會(huì)在某一個(gè)事務(wù)分支中提交更改。

注意 

  • 因?yàn)?XA 連接實(shí)例和 OracleXAResource 實(shí)例之間必須始終存在一對(duì)一的關(guān)聯(lián),所以當(dāng)關(guān)聯(lián)的 XA 連接實(shí)例關(guān)閉時(shí),隱式關(guān)閉 OracleXAResource 實(shí)例。
  • 如果事務(wù)由指定的 OracleXAResource 實(shí)例打開(kāi),則它也必須由相同的 OracleXAResource 實(shí)例關(guān)閉。

OracleXAResource 實(shí)例是實(shí)現(xiàn)標(biāo)準(zhǔn) javax.transaction.xa.XAResource 接口類(lèi)的實(shí)例。OceanBase Connector/J 使用OracleXAResource 類(lèi)實(shí)現(xiàn) XAResource 接口。

每當(dāng)調(diào)用 OracleXAConnection 類(lèi)的 getXAResource 方法時(shí), OceanBase Connector/J 都會(huì)創(chuàng)建并返回一個(gè) OracleXAResource 實(shí)例,并且將 OracleXAResource 實(shí)例與連接實(shí)例和通過(guò)該連接運(yùn)行的事務(wù)分支相關(guān)聯(lián)。

這種方法是將 OracleXAResource 實(shí)例與特定連接以及在該連接中運(yùn)行的事務(wù)分支相關(guān)聯(lián)的方式。

OracleXAResource 方法功能和輸入?yún)?shù)

OracleXAResource 類(lèi)具有幾種方法來(lái)協(xié)調(diào)事務(wù)分支和與其關(guān)聯(lián)的分布式事務(wù)。此功能通常涉及兩階段提交操作。

從中間層組件(例如應(yīng)用程序服務(wù)器)接收 OracleXAResource 實(shí)例的事務(wù)管理器通常會(huì)調(diào)用此功能。

這些方法中的每一個(gè)都以 Xid 實(shí)例的形式將事務(wù) ID 作為輸入,其中包括事務(wù)分支 ID 組件和分布式事務(wù) ID 組件。每個(gè)事務(wù)分支都有唯一的事務(wù) ID,但是屬于同一全局事務(wù)的事務(wù)分支作為其事務(wù) ID 的一部分,所以具有相同的全局事務(wù)組件。

Start

代表事務(wù)分支開(kāi)始工作,將事務(wù)分支與分布式事務(wù)相關(guān)聯(lián)。語(yǔ)法如下:


void start(Xid xid, int flags)

flags 參數(shù)必須是以下一個(gè)或多個(gè)值:

  • XAResource.TMNOFLAGS

    將新事務(wù)分支的開(kāi)始標(biāo)記為與此 XA 資源實(shí)例相關(guān)聯(lián)的會(huì)話中的后續(xù)操作。該分支將具有事務(wù) ID xid,這是由事務(wù)管理器創(chuàng)建的 OracleXid 實(shí)例。 這會(huì)將事務(wù)分支映射到適當(dāng)?shù)姆植际绞聞?wù)。

  • XAResource.TMJOIN

    將與此 XA 資源實(shí)例相關(guān)聯(lián)會(huì)話的后續(xù)操作加入到 xid 指定的現(xiàn)有事務(wù)分支中。

  • ?XAResource.TMRESUME?恢復(fù) xid 指定的事務(wù)分支。

說(shuō)明

 只能恢復(fù)之前掛起的事務(wù)分支。

  • OracleXAResource.ORATMSERIALIZABLE

    使用事務(wù) ID xid 啟動(dòng)可序列化的事務(wù)。

  • OracleXAResource.ORATMREADONLY

    使用事務(wù) ID xid 啟動(dòng)一個(gè)只讀事務(wù)。

  • OracleXAResource.ORATMREADWRITE

    使用事務(wù) ID xid 啟動(dòng)讀/寫(xiě)事務(wù)。

  • OracleXAResource.ORATRANSLOOSE

    使用事務(wù) ID xid 啟動(dòng)一個(gè)松散耦合的事務(wù)。

TMNOFLAGS、TMJOIN、TMRESUMEORATMSERIALIZABLE、ORATMREADONLY 和 ORATMREADWRITE 被定義為 XAResource 接口和 OracleXAResource 類(lèi)的 static 成員。ORATMSERIALIZABLE、ORATMREADONLY 和 ORATMREADWRITE 是隔離模式標(biāo)志。默認(rèn)的隔離行為是 READ COMMITTED。

說(shuō)明 

  • 代替使用 TMRESUME 的 start 方法,事務(wù)管理器可以強(qiáng)制轉(zhuǎn)換為 OracleXAResource 并使用 resume(Xid xid) 方法(Oracle 擴(kuò)展)。
  • 如果使用 TMRESUME,則還必須使用 TMNOMIGRATE,如 start(xid,XAResource.TMRESUME|OracleXAResource.TMNOMIGRATE) 中所示。這可以防止應(yīng)用程序收到錯(cuò)誤信息 ORA 1002: fetch out of sequence。
  • 如果錯(cuò)誤地使用了隔離模式標(biāo)識(shí),則會(huì)引發(fā)代碼為 XAER_INVAL 的異常。此外,因?yàn)闊o(wú)法設(shè)置現(xiàn)有事務(wù)的隔離級(jí)別,所以在恢復(fù)全局事務(wù)時(shí)不能使用隔離模式標(biāo)識(shí)。如果在恢復(fù)事務(wù)時(shí)嘗試使用隔離模式標(biāo)識(shí),則會(huì)引發(fā)代碼為 ORA-24790 的外部 Oracle 異常。
  • 為了避免錯(cuò)誤 Error ORA 1002: fetch out of sequence,請(qǐng)?jiān)趩?dòng)方法中包括 TMNOMIGRATE 標(biāo)識(shí)。例如:start(xid, XAResource.TMSUSPEND | OracleXAResource.TMNOMIGRATE);
  • 在編寫(xiě)使用這些標(biāo)識(shí)的事務(wù)管理器時(shí),請(qǐng)注意 OracleXAResource 中定義的所有標(biāo)志都是 Oracle 擴(kuò)展。

請(qǐng)注意,要在啟動(dòng)事務(wù)分支時(shí)創(chuàng)建適當(dāng)?shù)氖聞?wù) ID,事務(wù)管理器必須知道該事務(wù)分支屬于哪個(gè)分布式事務(wù)。其機(jī)制在中間層和事務(wù)管理器之間處理。

End

結(jié)束工作代表 xid 指定的事務(wù)分支,將事務(wù)分支與其分布式事務(wù)解除關(guān)聯(lián)。語(yǔ)法如下:


void end(Xid xid, int flags)

flags 參數(shù)可以具有以下值之一:

  • XAResource.TMSUCCESS

    這表明該事務(wù)分支已經(jīng)成功。

  • XAResource.TMFAIL

    這表明該事務(wù)分支已失敗。

  • XAResource.TMSUSPEND

    這是為了掛起 xid 指定的事務(wù)分支。通過(guò)掛起事務(wù)分支,您可以在單個(gè)會(huì)話中擁有多個(gè)事務(wù)分支。但是,在給定時(shí)間只能激活一個(gè)。這比進(jìn)行兩次會(huì)話要耗費(fèi)更多的資源。

TMSUCCESS、TMFAIL 和 TMSUSPEND 被定義為 XAResource 接口和 OracleXAResource 類(lèi)的靜態(tài)成員。

說(shuō)明 

  • 與使用 TMSUSPEND 的 end 方法不同,事務(wù)管理器可以將其強(qiáng)制轉(zhuǎn)換為 OracleXAResource 并使用 suspend(Xid xid) 方法(Oracle 擴(kuò)展)。
  • 暫停事務(wù)的 XA 功能提供了一種在單個(gè) JDBC 連接內(nèi)的各種事務(wù)之間進(jìn)行切換的方法。您可以使用 XA 類(lèi)來(lái)完成此操作。
  • 如果使用 TMSUSPEND,則還必須使用 TMNOMIGRATE,如 end(xid,XAResource.TMSUSPEND| OracleXAResource.TMNOMIGRATE) 所示。 這樣可以防止應(yīng)用程序收到錯(cuò)誤 ORA 1002: fetch out of sequence。
  • 為了避免錯(cuò)誤 Error ORA 1002: fetch out of sequence,請(qǐng)將 TMNOMIGRATE 標(biāo)識(shí)作為 end 方法的一部分。 例如:end(xid, XAResource.TMSUSPEND | OracleXAResource.TMNOMIGRATE);
  • 在編寫(xiě)使用這些標(biāo)識(shí)的事務(wù)管理器時(shí),請(qǐng)注意 OracleXAResource 中定義的所有標(biāo)志都是 Oracle 擴(kuò)展。

Prepare

在 xid 指定的事務(wù)分支中準(zhǔn)備執(zhí)行的更改。這是兩階段提交操作的第一階段,以確??梢栽L問(wèn)數(shù)據(jù)庫(kù)并且可以成功提交更改。語(yǔ)法如下:


int prepare(Xid xid)

此方法返回一個(gè)整數(shù)值,如下所示:

  • XAResource.XA_RDONLY

    如果事務(wù)分支僅運(yùn)行只讀操作(例如 SELECT 語(yǔ)句),則返回此值。

  • XAResource.XA_OK

    如果事務(wù)分支運(yùn)行所有準(zhǔn)備就緒且沒(méi)有錯(cuò)誤的更新,則返回此值。

  • NA(不返回任何值)

    如果事務(wù)分支運(yùn)行更新,如果其中任何一個(gè)在準(zhǔn)備過(guò)程中遇到錯(cuò)誤,則不返回任何值。在這種情況下,將引發(fā) XA 異常。

XA_RDONLY 和 XA_OK 被定義為 XAResource 接口和 OracleXAResource 類(lèi)的靜態(tài)成員。

說(shuō)明 

  • 在調(diào)用 prepare 方法之前始終在分支上調(diào)用 end 方法。
  • 如果分布式事務(wù)中只有一個(gè)事務(wù)分支,則無(wú)需調(diào)用 prepare 方法。無(wú)需預(yù)先準(zhǔn)備就可以調(diào)用OracleXAResource 提交方法。

Commit

在 xid 指定的事務(wù)分支中提交準(zhǔn)備好的更改。這是兩階段提交的第二階段,僅在成功準(zhǔn)備好所有事務(wù)分支之后才執(zhí)行。語(yǔ)法如下:


void commit(Xid xid, boolean onePhase)

設(shè)置 onePhase 參數(shù)如下:

  • true

    表示在提交事務(wù)分支時(shí)使用一階段協(xié)議而不是兩階段協(xié)議,適用于分布式事務(wù)中只有一個(gè)事務(wù)分支的情況。prepare 步驟將被跳過(guò)。

  • false

    表示在提交事務(wù)分支時(shí)使用兩階段協(xié)議。

Rollback

在 xid 指定的事務(wù)分支中回滾準(zhǔn)備好的更改。語(yǔ)法如下:


void rollback(Xid xid)

Forget

告訴資源管理器忘記啟發(fā)完成的事務(wù)分支。語(yǔ)法如下:


public void forget(Xid xid)

Recover

事務(wù)管理器在恢復(fù)期間調(diào)用此方法,以獲取當(dāng)前處于準(zhǔn)備完成或啟發(fā)完成狀態(tài)的事務(wù)分支的列表。語(yǔ)法如下:


public Xid[] recover(int flag) 

說(shuō)明 

TMSTARTRSCAN
TMENDRSCAN 和 
TMNOFLAGS 的 
flag 值會(huì)被忽略,其他的 
flag 值會(huì)引發(fā)異常。

資源管理器為當(dāng)前處于準(zhǔn)備或啟發(fā)完成狀態(tài)的事務(wù)分支返回零個(gè)或多個(gè) 
Xid。如果在操作過(guò)程中發(fā)生錯(cuò)誤,則資源管理器將引發(fā)適當(dāng)?shù)?nbsp;
XAException

說(shuō)明 
恢復(fù)方法要求在 Oracle 數(shù)據(jù)庫(kù)服務(wù)器中具有 
DBA_PENDING_TRANSACTIONS 的 
SELECT 權(quán)限和 
SYS.DBMS_XA 的 
EXECUTE 權(quán)限。

isSameRM

要確定兩個(gè) OracleXAResource 實(shí)例是否對(duì)應(yīng)于同一資源管理器,請(qǐng)從一個(gè) OracleXAResource 實(shí)例調(diào)用 isSameRM 方法,并指定另一個(gè) OracleXAResource 實(shí)例作為輸入。

在以下示例中,假定 xares1 和 xares2 是 OracleXAResource 實(shí)例:


boolean sameRM = is1.isSameRM(is2);

Xid 接口和 Oracle 實(shí)施

事務(wù)管理器創(chuàng)建事務(wù) ID 實(shí)例,并用于協(xié)調(diào)分布式事務(wù)的分支。每個(gè)事務(wù)分支都分配有唯一的事務(wù) ID,其中包括以下信息:

  • 格式識(shí)別碼

    格式標(biāo)識(shí)符指定 Java 事務(wù)管理器。例如,可能有一個(gè)格式標(biāo)識(shí)符 ORCL。該字段不能為空。格式標(biāo)識(shí)符的大小為 4 個(gè)字節(jié)。

  • 全局事務(wù)標(biāo)識(shí)符

    它也被稱為分布式事務(wù) ID 組件。全局事務(wù)標(biāo)識(shí)符的大小為 64 個(gè)字節(jié)。

  • 分支限定符

    也稱為事務(wù)分支 ID 組件。分支限定符的大小為 64 個(gè)字節(jié)。

屬于同一分布式事務(wù)的所有事務(wù)分支的事務(wù) ID 具有相同的 64 字節(jié)全局事務(wù)標(biāo)識(shí)符值。但是,總的事務(wù) ID 對(duì)于每個(gè)事務(wù)分支都是唯一的。

XA 事務(wù) ID 實(shí)例是實(shí)現(xiàn)標(biāo)準(zhǔn) javax.transaction.xa.Xid 接口類(lèi)的實(shí)例,該接口是 X/Open 事務(wù)的標(biāo)識(shí)符 XID 的結(jié)構(gòu)的 Java 映射。

Oracle 使用 oracle.jdbc.xa 包中的 OracleXid 類(lèi)實(shí)現(xiàn)此接口。OracleXid 實(shí)例僅在事務(wù)管理器中使用,對(duì)應(yīng)用程序或應(yīng)用服務(wù)器透明。

說(shuō)明 
Oracle 不需要將 
OracleXid 用于 
OracleXAResource 調(diào)用。相反,請(qǐng)使用實(shí)現(xiàn) 
javax.transaction.xa.Xid 接口的任何類(lèi)。

事務(wù)管理器在創(chuàng)建 OracleXid 實(shí)例時(shí)可以使用以下內(nèi)容:


public OracleXid(int fId, byte gId[], byte bId[]) throws XAException

其中,fId 是格式標(biāo)識(shí)符的整數(shù)值,gId [] 是全局事務(wù)標(biāo)識(shí)符的字節(jié)數(shù)組,bId [] 是分支限定符的字節(jié)數(shù)組。

Xid 接口指定以下 getter 方法:

  • public int getFormatId()

  • public byte[] getGlobalTransactionId()

  • public type[] getBranchQualifier()


分享名稱:創(chuàng)新互聯(lián)OceanBase教程:OceanBaseXA組件
文章鏈接:http://www.dlmjj.cn/article/dpeisog.html