글로벌 분산 트랜잭션에 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 프로토콜을 사용하여 각 데이터베이스 또는 기타 리소스에 대해 XA RM(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 인터페이스를 구현하는 라이브러리를 제공합니다. 이 라이브러리를 사용하면 클라이언트측 트랜잭션 관리자가 Global 트랜잭션을 조정할 수 있습니다. 전역 트랜잭션은 데이터베이스 업데이트 및 블록체인 트랜잭션과 같은 작업을 포함할 수 있는 단일 작업 단위로, 모두 원자적으로 커밋되어야 합니다. 즉, 모든 작업이 성공적으로 커밋되어야 합니다. 전역 트랜잭션의 일부인 작업이 실패하면 모든 작업이 롤백됩니다. XA 인터페이스는 기본 트랜잭션 REST 끝점에서 지원되는 프로토콜과 비슷한 2단계 커밋 프로토콜을 사용합니다. Oracle Blockchain Platform의 기본 트랜잭션에 대한 자세한 내용은 Make Atomic Updates Across Chaincodes and Channels를 참조하십시오.

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

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

XA 라이브러리를 Oracle Blockchain Platform과 함께 사용하려면 응용 프로그램이 요청된 작업의 인증 및 권한 부여를 위한 자격 증명을 제공해야 합니다. 라이브러리는 기본 인증(사용자/비밀번호) 및 OAuth 2.0 액세스 토큰을 모두 지원하며, OBPXADataSource 인스턴스를 만들 때 구성할 수 있습니다. 두 가지 인증 방법은 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의 서로 다른 두 인스턴스에 잔액 이전 및 마블 샘플을 설치합니다. 그러면 각 Instance는 XA 데이터 소스에 해당합니다.

  • 상품 채널에 Marbles 체인 코드가 설치된 XA 리소스 OBP-1
  • 전자 지갑 채널에 잔액 이전 체인 코드가 설치된 XA 리소스 OBP-2

이 시나리오에서는 여러 데이터 소스에 걸쳐 있는 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