Includi Oracle Blockchain Platform nelle transazioni distribuite globali
L'applicazione potrebbe dover eseguire aggiornamenti nel libro contabile di Oracle Blockchain Platform e in altri repository come database o altri registri blockchain in modo atomico, in cui tutti gli aggiornamenti hanno successo o nessuno ha successo.
Per abilitare gli aggiornamenti atomici su più database, gli sviluppatori utilizzano transazioni globali coordinate da coordinatori di transazioni distribuite come Oracle WebLogic Server, Oracle Tuxedo, Oracle Transaction Manager for Microservices, JBoss Enterprise Application Platform, IBM WebSphere e altri sistemi. Tutti questi sistemi si basano sul protocollo X/Open XA per orchestrare un processo di commit in due fasi utilizzando API standard fornite da XA Resource Manager (RM) per ogni database o altra risorsa. Oracle Blockchain Platform supporta i commit in due fasi e fornisce la propria libreria XA RM, che i coordinatori delle transazioni esterne possono utilizzare per richiamare le API conformi a XA. Queste transazioni globali possono anche includere una singola risorsa non XA (ad esempio, un libro contabile blockchain non Oracle o un database non conforme a XA) utilizzando un'ottimizzazione dell'ultimo commit delle risorse.
La specifica XA fa parte dell'architettura X/Open Distributed Transaction Processing, che definisce un'architettura standard che consente a più programmi applicativi di condividere le risorse fornite da più gestori di risorse. L'interfaccia Java XA stessa è definita come parte della piattaforma Java. Per ulteriori informazioni sull'interfaccia XA Java, vedere l'interfaccia XAResource nella documentazione di Java.
Oracle Blockchain Platform fornisce una libreria conforme alla specifica XA e implementa l'interfaccia Java standard per un Resource Manager XA. La libreria consente a un Transaction Manager lato client di coordinare le transazioni globali. Una transazione globale è una singola unità di lavoro che potrebbe includere operazioni come gli aggiornamenti del database e le transazioni blockchain, che devono essere tutte sottoposte a commit atomico. In altre parole, tutte le operazioni devono riuscire ad essere impegnate. Se un'operazione qualsiasi che fa parte della transazione globale non riesce, viene eseguito il rollback di tutte le operazioni. L'interfaccia XA si basa sul protocollo di commit a due fasi, simile al protocollo supportato dagli endpoint REST delle transazioni atomiche. Per ulteriori informazioni sulle transazioni atomiche in Oracle Blockchain Platform, vedere Produrre aggiornamenti atomici tra codici e canali concatenati.
L'implementazione XA per Oracle Blockchain Platform viene fornita come libreria Java, scaricabile dalla scheda Strumenti sviluppatore nel riquadro Sviluppo applicazioni della console di Oracle Blockchain Platform.
OBPXAResource, OBPXADataSource e OBPXAConnection.
| Oggetto | Scopo |
|---|---|
OBPXAResource |
Questa classe implementa le API necessarie per un Transaction Manager da coordinare con Oracle Blockchain Platform come Resource Manager per le transazioni XA. |
OBPXADataSource |
Utilizzare questo oggetto per ottenere un'istanza di OBPXAConnection e specificare le credenziali di autenticazione e autorizzazione.
|
OBPXAConnection |
Utilizzare questo oggetto per ottenere un'istanza dell'oggetto OBPXAResource e per definire le transazioni blockchain da eseguire come parte di una transazione XA.
|
Per utilizzare la libreria XA con Oracle Blockchain Platform, l'applicazione deve fornire le credenziali per l'autenticazione e l'autorizzazione delle operazioni richieste. La libreria supporta sia l'autenticazione di base (utente/password) che i token di accesso OAuth 2.0, che è possibile configurare quando si crea l'istanza OBPXADataSource. I due metodi di autenticazione sono coerenti con i metodi di autenticazione utilizzati con il proxy REST Oracle Blockchain Platform. È possibile utilizzare l'autenticazione di base per scopi di test e sviluppo interno. Non utilizzare l'autenticazione di base negli ambienti di produzione. Per ulteriori informazioni, vedere Autenticazione nella documentazione dell'API REST.
OBPXADataSource, è possibile utilizzare il metodo obpxaDataSource.getXAConnection() per ottenere l'istanza xaConnection. Per aggiornare l'autenticazione quando si utilizzano i token di accesso OAuth 2.0, è possibile utilizzare il metodo getXAConnection, come mostrato nel codice seguente:OBPXAConnection xaConnection = obpxaDataSource.getXAConnection(accessToken); // get an XA connection using an OAuth 2.0 access tokenÈ inoltre possibile utilizzare il metodo getXAConnection per aggiornare l'autenticazione di base.OBPXAConnection xaConnection = obpxaDataSource.getXAConnection(user, password); // get an XA connection using username and password for basic authenticationpublic void createXAInvokeTransaction(Xid xid, OBPXAInvokeTxRequest invokeTxRequest)In questo metodo, xid è un identificativo di transazione globale e invokeTxRequest è la transazione blockchain da eseguire come parte della transazione XA globale. Per creare una richiesta di transazione di richiamo XA, utilizzare il metodo costruttore seguente:OBPXAInvokeTxRequest invokeTxRequest = new OBPXAInvokeTxRequest(channel, chaincode, args);In questo metodo costruttore, channel è il canale in cui verrà eseguita la transazione blockchain, chaincode è il codice concatenato da utilizzare e args include la funzione codice concatenato e qualsiasi argomento da utilizzare per la transazione.
Lo snippet di codice seguente mostra la creazione di un oggetto OBPXADataSource, il recupero dell'istanza OBPXAConnection, la creazione della richiesta di transazione e la chiamata del metodo createXAInvokeTransaction.
OBPXADataSource obpxaDataSource = OBPXADataSource.builder()
.withHost(host)
.withPort(port)
.withBasicAuth(username, password)
.withRole(role)
.build();
.
.
.
OBPXAConnection obpxaConnection = obpxaDataSource.getXAConnection();
OBPXAInvokeTxRequest invokeTxRequest = new OBPXAInvokeTxRequest(channel, chaincode, args);
invokeTxRequest.setEndorsers(endorsersArray); // optional blockchain transaction request attributes
invokeTxRequest.setTransientMap(transientMap); // optional blockchain transaction request attributes
invokeTxRequest.setTimeout(60000); // optional blockchain transaction request attributes
obpxaConnection.createXAInvokeTransaction(xid, invokeTxRequest);Scenario: esplora transazioni XA mediante campioni
Lo scenario riportato di seguito è simile a quello descritto per le transazioni atomiche: Scenario: Esplora transazioni atomiche utilizzando i campioni, che utilizza gli esempi Trasferimento saldo e Marmi inclusi in Oracle Blockchain Platform.
In questo scenario, è possibile installare gli esempi Trasferimento saldo e Marmi su due diverse istanze di Oracle Blockchain Platform. Ogni istanza corrisponde quindi a un'origine dati XA:
- Risorsa XA OBP-1, con il codice concatenato Marbles installato sul canale merci
- Risorsa XA OBP-2, con il codice concatenato di trasferimento saldo installato sul canale wallet
In questo scenario, è possibile utilizzare una transazione XA che si estende su più origini dati per garantire che lo scambio di fondi e il trasferimento di marmo avvengano in modo atomico, dove tutte le operazioni hanno successo o nessuna ha successo. Il seguente codice illustra questo scenario:
OBPXADataSource obpxaDS1 = ... // create an XA data source, supplying details about the OBP-1 instance
OBPXADataSource obpxaDS2 = ... // create an XA data source, supplying details about the OBP-2 instance
// start a global transaction in the client application
// invoke marble transfer on OBP-1
OBPXAConnection obpxaConn1 = (OBPXAConnection) obpxaDS1.getXAConnection();
OBPXAInvokeTxRequest invokeMarbleTransferReq = new OBPXAInvokeTxRequest("goods", "obcs-marbles", new String[]{"transferMarble", "marble1", "tom"});
obpxaConn1.createXAInvokeTransaction(xid1, invokeMarbleTransferReq);
.
.
.
// invoke fund transfer on OBP-2
OBPXAConnection obpxaConn2 = (OBPXAConnection) obpxaDS2.getXAConnection();
OBPXAInvokeTxRequest invokeBalanceTransferReq = new OBPXAInvokeTxRequest("wallet", "obcs-example02", new String[]{"invoke", "a", "b", "50"});
obpxaConn2.createXAInvokeTransaction(xid2, invokeBalanceTransferReq);
.
.
.
// end the global transaction in the client application