글로벌 분산 트랜잭션에 Oracle Blockchain Platform 포함

애플리케이션이 Oracle Blockchain Platform 원장 및 기타 저장소(예: 데이터베이스 또는 기타 블록체인 원장)에서 모든 업데이트가 성공하거나 성공하지 못하는 방식으로 업데이트를 수행해야 할 수도 있습니다.

여러 데이터베이스에서 원자 갱신을 활성화하기 위해 개발자는 Oracle WebLogic Server, Oracle Tuxedo, Oracle Transaction Manager for Microservices, JBoss Enterprise Application Platform, IBM WebSphere 및 기타 시스템과 같은 분산 트랜잭션 조정자가 조정하는 전역 트랜잭션을 사용합니다. 이러한 모든 시스템은 X/Open XA 프로토콜을 사용하여 각 데이터베이스 또는 기타 리소스에 대해 RM(XA Resource Manager)에서 제공하는 표준 API를 사용하여 2단계 커밋 프로세스를 조정합니다. Oracle Blockchain Platform은 2단계 커밋을 지원하며 외부 트랜잭션 조정자가 XA 호환 API를 호출하는 데 사용할 수 있는 자체 XA RM 라이브러리를 제공합니다. 또한 이러한 전역 트랜잭션에는 마지막 리소스 커밋 최적화를 사용하여 단일 비XA 리소스(예: 비Oracle 블록체인 원장 또는 비XA 호환 데이터베이스)가 포함될 수 있습니다.

XA 사양은 여러 응용 프로그램이 여러 리소스 관리자가 제공하는 리소스를 공유할 수 있도록 하는 표준 구조를 정의하는 X/Open Distributed Transaction Processing 구조의 일부입니다. Java XA 인터페이스 자체는 Java 플랫폼의 일부로 정의됩니다. Java XA 인터페이스에 대한 자세한 내용은 Java 설명서의 Interface XAResource을 참조하십시오.

Oracle Blockchain Platform은 XA 사양을 준수하고 XA 리소스 관리자에 대한 표준 Java 인터페이스를 구현하는 라이브러리를 제공합니다. 이 라이브러리를 사용하면 클라이언트측 트랜잭션 관리자가 전역 트랜잭션을 조정할 수 있습니다. 글로벌 트랜잭션은 데이터베이스 업데이트 및 블록체인 트랜잭션과 같은 작업을 포함할 수 있는 단일 작업 단위로, 모두 원자적으로 커밋되어야 합니다. 즉, 모든 작업이 성공적으로 커밋되어야 합니다. 전역 트랜잭션의 일부인 작업이 실패하면 모든 작업이 롤백됩니다. XA 인터페이스는 원자 트랜잭션 REST 엔드포인트에서 지원하는 프로토콜과 유사하게 2단계 커밋 프로토콜을 사용합니다. Oracle Blockchain Platform의 기본 트랜잭션에 대한 자세한 내용은 체인 코드 및 채널 전체에서 기본 업데이트 만들기를 참조하십시오.

Oracle Blockchain Platform에 대한 XA 구현은 Java 라이브러리로 제공되며, Oracle Blockchain Platform 콘솔의 애플리케이션 개발 창에 있는 개발자 툴 탭에서 다운로드할 수 있습니다.

라이브러리에 대한 자세한 내용은 다운로드 가능한 파일에 제공된 Javadoc 정보에 포함되어 있습니다. 라이브러리에서 지원하는 세 가지 키 객체는 OBPXAResource, OBPXADataSourceOBPXAConnection입니다.
객체 용도
OBPXAResource 이 클래스는 트랜잭션 관리자가 XA 트랜잭션에 대한 리소스 관리자로 Oracle Blockchain Platform과 조율하는 데 필요한 API를 구현합니다.
OBPXADataSource 이 객체를 사용하여 OBPXAConnection의 인스턴스를 가져오고 인증 및 권한 부여 인증서를 지정합니다.
OBPXAConnection 이 객체를 사용하여 OBPXAResource 객체의 인스턴스를 가져오고 XA 트랜잭션의 일부로 실행할 블록체인 트랜잭션을 정의합니다.

Oracle Blockchain Platform에서 XA 라이브러리를 사용하려면 애플리케이션이 요청된 작업의 인증 및 권한 부여를 위한 자격 증명을 제공해야 합니다. 라이브러리는 기본 인증(사용자/비밀번호) 및 OBPXADataSource 인스턴스를 만들 때 구성할 수 있는 OAuth 2.0 액세스 토큰을 모두 지원합니다. 두 가지 인증 방법은 Oracle Blockchain Platform REST 프록시와 함께 사용하는 인증 방법과 일치합니다. 자세한 내용은 REST API 설명서의 인증을 참조하십시오.

OBPXADataSource 인스턴스를 생성한 후 obpxaDataSource.getXAConnection() 메소드를 사용하여 xaConnection 인스턴스를 가져올 수 있습니다. OAuth 2.0 액세스 토큰을 사용할 때 인증을 업데이트하려면 다음 코드에 표시된 대로 getXAConnection 메소드를 사용할 수 있습니다.
OBPXAConnection xaConnection = obpxaDataSource.getXAConnection(accessToken);      // get an XA connection using an OAuth 2.0 access token
getXAConnection 방법을 사용하여 기본 인증을 업데이트할 수도 있습니다.
OBPXAConnection xaConnection = obpxaDataSource.getXAConnection(user, password);   // get an XA connection using username and password for basic authentication
전역 XA 트랜잭션의 일부로 실행할 블록체인 트랜잭션을 정의하려면 다음 방법을 사용합니다.
public void createXAInvokeTransaction​(Xid xid, OBPXAInvokeTxRequest invokeTxRequest)
이 방법에서 xid는 전역 트랜잭션 식별자이고 invokeTxRequest는 전역 XA 트랜잭션의 일부로 실행될 블록체인 트랜잭션입니다. XA 호출 트랜잭션 요청을 생성하려면 다음 생성자 메소드를 사용합니다.
OBPXAInvokeTxRequest invokeTxRequest = new OBPXAInvokeTxRequest(channel, chaincode, args);
이 생성자 메소드에서 channel는 블록체인 트랜잭션이 실행될 채널이고, chaincode는 사용할 체인코드이고, args에는 체인코드 함수와 트랜잭션에 사용할 인수가 포함됩니다.

다음 코드 조각은 OBPXADataSource 객체 생성, OBPXAConnection 인스턴스 가져오기, 트랜잭션 요청 생성 및 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);

시나리오: 샘플을 사용하여 XA 트랜잭션 탐색

다음 시나리오는 원자 트랜잭션에 대해 설명된 시나리오와 유사합니다. 시나리오: 샘플을 사용하여 원자 트랜잭션 탐색 - Oracle Blockchain Platform에 포함된 잔액 이전 및 마블 샘플을 사용합니다.

이 시나리오에서는 Oracle Blockchain Platform의 서로 다른 두 인스턴스에 잔액 이전 및 마블 샘플을 설치합니다. 그런 다음 각 인스턴스는 XA 데이터 소스에 해당합니다.

  • goods 채널에 Marbles 체인 코드가 설치된 XA 리소스 OBP-1
  • XA 리소스 OBP-2, 잔액 전송 체인 코드가 wallet 채널에 설치됨

이 시나리오에서는 여러 데이터 소스에 걸쳐 있는 XA 트랜잭션을 사용하여 자금 교환 및 대리석류 전송이 모든 작업이 성공하거나 성공하지 못하는 원자 방식으로 수행되도록 할 수 있습니다. 다음 코드는 이 시나리오를 보여줍니다.

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

대리석류 샘플과 대리석 소유자 필드의 기본값에는 알려진 문제가 있습니다. 자세한 내용은 Oracle Blockchain Platform에 대해 알려진 문제를 참조하십시오.