W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
XA 組件是 OceanBase Connector/J 指定的標準 XA 接口。
javax.sql.XADataSource
接口概述了 XA 數據源的標準功能,是 XA 連接的工廠。getXAConnection
方法重載返回一個 XA 連接實例,并可以選擇使用用戶名和密碼作為輸入,如下所示:
public interface XADataSource
{
XAConnection getXAConnection() throws SQLException;
XAConnection getXAConnection(String user, String password)
throws SQLException;
...
}
OceanBase Connector/J 使用 OracleXADataSource
類實現 XADataSource
接口。OracleXADataSource
類還擴展了 OracleConnectionPoolDataSource
類,而 OracleConnectionPoolDataSource
類擴展了 OracleDataSource
類,因此包括所有連接屬性。
OracleXADataSource
類的 getXAConnection
方法返回 XA 連接實例的 Oracle 實現,這些實例是 OracleXAConnection
實例。
說明
您可以使用前面討論的非池化數據源相同的命名約定在 Java 命名目錄和接口(JNDI)中注冊 XA 數據源。
XA 連接實例與池連接實例一樣,封裝了與數據庫的物理連接。 這里的數據庫是指在產生 XA 連接實例的 XA 數據源實例的連接屬性中指定的數據庫。
每個 XA 連接實例還具有生成 OracleXAResource
實例的功能,該實例將與之相對應以用于協(xié)調分布式事務。
XA 連接實例是實現標準 javax.sql.XAConnection
接口類的實例,如下所示:
public interface XAConnection extends PooledConnection
{
javax.jta.xa.XAResource getXAResource() throws SQLException;
}
XAConnection
接口擴展了 javax.sql.PooledConnection
接口,因此還包括 getConnection
、close
、addConnectionEventListener
和 removeConnectionEventListener
方法。
JDBC 使用 OracleXAConnection
類實現 XAConnection
接口,OracleXAConnection
類還擴展了 OraclePooledConnection
類。
OracleXAConnection
類的 getXAResource
方法返回 OracleXAResource
實例的 Oracle 實現,該實例是一個OracleXAResource
實例。getConnection
方法返回一個 OracleConnection
實例。
XA 連接實例返回的 OceanBase Connector/J 連接實例充當物理連接的臨時句柄,而不是封裝物理連接。物理連接由 XA 連接實例封裝。與常規(guī)連接完全相同,連接從 XAConnection
對象獲得連接的行為,直至參與到全局事務為止。這時,自動提交狀態(tài)設置為 false
。全局事務結束后,自動提交狀態(tài)將返回到其在全局事務之前的值。從 XAConnection
獲得的連接的默認自動提交狀態(tài)均為 true
。
每次調用 XA 連接實例的 getConnection
方法時,都會返回一個表現出默認行為的新連接實例,并關閉以前存在的并由同一 XA 連接實例返回的所有以前的連接實例。但是,建議在打開新的連接實例之前顯式關閉先前的連接實例。
調用 XA 連接實例的 close
方法將關閉與數據庫的物理連接,并通常在中間層執(zhí)行。
事務管理器使用 OracleXAResource
實例來協(xié)調分布式事務的所有事務分支。
每個 OracleXAResource
實例都提供給事務管理器調用的關鍵功能,如下:
將分布式事務與產生此 OracleXAResource
實例的 XA 連接實例中運行的事務分支關聯(lián)和解除關聯(lián)。本質上,是將分布式事務與 XA 連接實例封裝的物理連接或會話相關聯(lián)。這是通過使用事務 ID 來完成的。
執(zhí)行分布式事務的兩階段提交功能,以確保在所有事務分支中更改都成功之前,不會在某一個事務分支中提交更改。
注意
- 因為 XA 連接實例和
OracleXAResource
實例之間必須始終存在一對一的關聯(lián),所以當關聯(lián)的 XA 連接實例關閉時,隱式關閉OracleXAResource
實例。- 如果事務由指定的
OracleXAResource
實例打開,則它也必須由相同的OracleXAResource
實例關閉。
OracleXAResource
實例是實現標準 javax.transaction.xa.XAResource
接口類的實例。OceanBase Connector/J 使用OracleXAResource
類實現 XAResource
接口。
每當調用 OracleXAConnection
類的 getXAResource
方法時, OceanBase Connector/J 都會創(chuàng)建并返回一個 OracleXAResource
實例,并且將 OracleXAResource
實例與連接實例和通過該連接運行的事務分支相關聯(lián)。
這種方法是將 OracleXAResource
實例與特定連接以及在該連接中運行的事務分支相關聯(lián)的方式。
OracleXAResource
類具有幾種方法來協(xié)調事務分支和與其關聯(lián)的分布式事務。此功能通常涉及兩階段提交操作。
從中間層組件(例如應用程序服務器)接收 OracleXAResource
實例的事務管理器通常會調用此功能。
這些方法中的每一個都以 Xid
實例的形式將事務 ID 作為輸入,其中包括事務分支 ID 組件和分布式事務 ID 組件。每個事務分支都有唯一的事務 ID,但是屬于同一全局事務的事務分支作為其事務 ID 的一部分,所以具有相同的全局事務組件。
Start
代表事務分支開始工作,將事務分支與分布式事務相關聯(lián)。語法如下:
void start(Xid xid, int flags)
flags
參數必須是以下一個或多個值:
XAResource.TMNOFLAGS
將新事務分支的開始標記為與此 XA 資源實例相關聯(lián)的會話中的后續(xù)操作。該分支將具有事務 ID xid
,這是由事務管理器創(chuàng)建的 OracleXid
實例。 這會將事務分支映射到適當的分布式事務。
XAResource.TMJOIN
將與此 XA 資源實例相關聯(lián)會話的后續(xù)操作加入到 xid
指定的現有事務分支中。
?XAResource.TMRESUME
?恢復 xid 指定的事務分支。
說明
只能恢復之前掛起的事務分支。
OracleXAResource.ORATMSERIALIZABLE
使用事務 ID xid
啟動可序列化的事務。
OracleXAResource.ORATMREADONLY
使用事務 ID xid
啟動一個只讀事務。
OracleXAResource.ORATMREADWRITE
使用事務 ID xid
啟動讀/寫事務。
OracleXAResource.ORATRANSLOOSE
使用事務 ID xid
啟動一個松散耦合的事務。
TMNOFLAGS
、TMJOIN
、TMRESUME
、ORATMSERIALIZABLE
、ORATMREADONLY
和 ORATMREADWRITE
被定義為 XAResource
接口和 OracleXAResource
類的 static
成員。ORATMSERIALIZABLE
、ORATMREADONLY
和 ORATMREADWRITE
是隔離模式標志。默認的隔離行為是 READ COMMITTED
。
說明
- 代替使用
TMRESUME
的start
方法,事務管理器可以強制轉換為OracleXAResource
并使用resume(Xid xid)
方法(Oracle 擴展)。- 如果使用
TMRESUME
,則還必須使用TMNOMIGRATE
,如start(xid,XAResource.TMRESUME|OracleXAResource.TMNOMIGRATE)
中所示。這可以防止應用程序收到錯誤信息ORA 1002: fetch out of sequence
。- 如果錯誤地使用了隔離模式標識,則會引發(fā)代碼為
XAER_INVAL
的異常。此外,因為無法設置現有事務的隔離級別,所以在恢復全局事務時不能使用隔離模式標識。如果在恢復事務時嘗試使用隔離模式標識,則會引發(fā)代碼為ORA-24790
的外部 Oracle 異常。- 為了避免錯誤
Error ORA 1002: fetch out of sequence
,請在啟動方法中包括TMNOMIGRATE
標識。例如:start(xid, XAResource.TMSUSPEND | OracleXAResource.TMNOMIGRATE);
- 在編寫使用這些標識的事務管理器時,請注意
OracleXAResource
中定義的所有標志都是 Oracle 擴展。
請注意,要在啟動事務分支時創(chuàng)建適當的事務 ID,事務管理器必須知道該事務分支屬于哪個分布式事務。其機制在中間層和事務管理器之間處理。
End
結束工作代表 xid
指定的事務分支,將事務分支與其分布式事務解除關聯(lián)。語法如下:
void end(Xid xid, int flags)
flags
參數可以具有以下值之一:
XAResource.TMSUCCESS
這表明該事務分支已經成功。
XAResource.TMFAIL
這表明該事務分支已失敗。
XAResource.TMSUSPEND
這是為了掛起 xid
指定的事務分支。通過掛起事務分支,您可以在單個會話中擁有多個事務分支。但是,在給定時間只能激活一個。這比進行兩次會話要耗費更多的資源。
TMSUCCESS
、TMFAIL
和 TMSUSPEND
被定義為 XAResource
接口和 OracleXAResource
類的靜態(tài)成員。
說明
- 與使用
TMSUSPEND
的end
方法不同,事務管理器可以將其強制轉換為OracleXAResource
并使用suspend(Xid xid)
方法(Oracle 擴展)。- 暫停事務的 XA 功能提供了一種在單個 JDBC 連接內的各種事務之間進行切換的方法。您可以使用 XA 類來完成此操作。
- 如果使用
TMSUSPEND
,則還必須使用TMNOMIGRATE
,如end(xid,XAResource.TMSUSPEND| OracleXAResource.TMNOMIGRATE)
所示。 這樣可以防止應用程序收到錯誤ORA 1002: fetch out of sequence
。- 為了避免錯誤
Error ORA 1002: fetch out of sequence
,請將TMNOMIGRATE
標識作為end
方法的一部分。 例如:end(xid, XAResource.TMSUSPEND | OracleXAResource.TMNOMIGRATE);
- 在編寫使用這些標識的事務管理器時,請注意
OracleXAResource
中定義的所有標志都是 Oracle 擴展。
Prepare
在 xid
指定的事務分支中準備執(zhí)行的更改。這是兩階段提交操作的第一階段,以確??梢栽L問數據庫并且可以成功提交更改。語法如下:
int prepare(Xid xid)
此方法返回一個整數值,如下所示:
XAResource.XA_RDONLY
如果事務分支僅運行只讀操作(例如 SELECT
語句),則返回此值。
XAResource.XA_OK
如果事務分支運行所有準備就緒且沒有錯誤的更新,則返回此值。
NA(不返回任何值)
如果事務分支運行更新,如果其中任何一個在準備過程中遇到錯誤,則不返回任何值。在這種情況下,將引發(fā) XA 異常。
XA_RDONLY
和 XA_OK
被定義為 XAResource
接口和 OracleXAResource
類的靜態(tài)成員。
說明
- 在調用
prepare
方法之前始終在分支上調用end
方法。- 如果分布式事務中只有一個事務分支,則無需調用
prepare
方法。無需預先準備就可以調用OracleXAResource
提交方法。
Commit
在 xid
指定的事務分支中提交準備好的更改。這是兩階段提交的第二階段,僅在成功準備好所有事務分支之后才執(zhí)行。語法如下:
void commit(Xid xid, boolean onePhase)
設置 onePhase
參數如下:
true
表示在提交事務分支時使用一階段協(xié)議而不是兩階段協(xié)議,適用于分布式事務中只有一個事務分支的情況。prepare
步驟將被跳過。
false
表示在提交事務分支時使用兩階段協(xié)議。
Rollback
在 xid
指定的事務分支中回滾準備好的更改。語法如下:
void rollback(Xid xid)
Forget
告訴資源管理器忘記啟發(fā)完成的事務分支。語法如下:
public void forget(Xid xid)
Recover
事務管理器在恢復期間調用此方法,以獲取當前處于準備完成或啟發(fā)完成狀態(tài)的事務分支的列表。語法如下:
public Xid[] recover(int flag)
說明TMSTARTRSCAN
、TMENDRSCAN
和TMNOFLAGS
的flag
值會被忽略,其他的flag
值會引發(fā)異常。
資源管理器為當前處于準備或啟發(fā)完成狀態(tài)的事務分支返回零個或多個Xid
。如果在操作過程中發(fā)生錯誤,則資源管理器將引發(fā)適當的XAException
。
說明
恢復方法要求在 Oracle 數據庫服務器中具有DBA_PENDING_TRANSACTIONS
的SELECT
權限和SYS.DBMS_XA
的EXECUTE
權限。
isSameRM
要確定兩個 OracleXAResource
實例是否對應于同一資源管理器,請從一個 OracleXAResource
實例調用 isSameRM
方法,并指定另一個 OracleXAResource
實例作為輸入。
在以下示例中,假定 xares1
和 xares2
是 OracleXAResource
實例:
boolean sameRM = is1.isSameRM(is2);
事務管理器創(chuàng)建事務 ID 實例,并用于協(xié)調分布式事務的分支。每個事務分支都分配有唯一的事務 ID,其中包括以下信息:
格式識別碼
格式標識符指定 Java 事務管理器。例如,可能有一個格式標識符 ORCL
。該字段不能為空。格式標識符的大小為 4 個字節(jié)。
全局事務標識符
它也被稱為分布式事務 ID 組件。全局事務標識符的大小為 64 個字節(jié)。
分支限定符
也稱為事務分支 ID 組件。分支限定符的大小為 64 個字節(jié)。
屬于同一分布式事務的所有事務分支的事務 ID 具有相同的 64 字節(jié)全局事務標識符值。但是,總的事務 ID 對于每個事務分支都是唯一的。
XA 事務 ID 實例是實現標準 javax.transaction.xa.Xid
接口類的實例,該接口是 X/Open 事務的標識符 XID 的結構的 Java 映射。
Oracle 使用 oracle.jdbc.xa
包中的 OracleXid
類實現此接口。OracleXid
實例僅在事務管理器中使用,對應用程序或應用服務器透明。
說明
Oracle 不需要將OracleXid
用于OracleXAResource
調用。相反,請使用實現javax.transaction.xa.Xid
接口的任何類。
事務管理器在創(chuàng)建 OracleXid
實例時可以使用以下內容:
public OracleXid(int fId, byte gId[], byte bId[]) throws XAException
其中,fId
是格式標識符的整數值,gId []
是全局事務標識符的字節(jié)數組,bId []
是分支限定符的字節(jié)數組。
Xid
接口指定以下 getter
方法:
public int getFormatId()
public byte[] getGlobalTransactionId()
public type[] getBranchQualifier()
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: