11.3.2. 단일 단계 커밋을 위한 LRCO 최적화 정보(1PC)

단일 단계 커뮤니티(1PC)

2단계 커밋 프로토콜(2PC)이 트랜잭션에서 더 일반적으로 발생하지만 일부 상황에는 두 단계 모두 필요하지 않거나 수용할 수 없습니다. 이 경우 단일 단계 커밋(1PC) 프로토콜을 사용할 수 있습니다. 단일 단계 통신 프로토콜은 하나의 XA 또는 비 XA 리소스만 글로벌 트랜잭션의 일부인 경우에만 사용됩니다.

준비 단계는 일반적으로 두 번째 단계가 처리될 때까지 리소스를 잠급니다. 단일 단계 커밋은 준비 단계를 건너뛰고 리소스에서 커밋만 처리됩니다. 지정하지 않으면 글로벌 트랜잭션에 참가자가 한 명만 포함된 경우 단일 단계 커밋 최적화가 자동으로 사용됩니다.

마지막 리소스 커밋 최적화 (LRCO)

XA 트랜잭션에 비 XA 데이터 소스가 참여하는 경우 LRCO(마지막 리소스 커밋 최적화)라고 알려진 최적화가 사용됩니다. 이 프로토콜을 사용하면 대부분의 트랜잭션이 정상적으로 완료될 수 있지만, 특정 유형의 오류로 인해 일관되지 않은 트랜잭션 결과가 발생할 수 있습니다. 따라서 이 접근 방식을 마지막 수단으로만 사용하십시오.

비 XA 리소스는 준비 단계 종료 시 처리되며 이를 커밋하기 위한 시도가 수행됩니다. 커밋이 성공하면 트랜잭션 로그가 작성되고 나머지 리소스는 커밋 단계를 거칩니다. 마지막 리소스를 커밋하지 못하면 트랜잭션이 롤백됩니다.

트랜잭션에서 단일 로컬 TX 데이터 소스를 사용하는 경우 LRCO가 자동으로 적용됩니다.

이전에는 LRCO 방법을 통해 XA 트랜잭션에 비 XA 리소스를 추가할 수 있었습니다. 그러나 LRCO에는 오류 창이 있습니다. LRCO 방법을 사용하여 XA 트랜잭션에 비 XA 리소스를 추가하는 절차는 다음과 같습니다.

  1. XA 트랜잭션을 준비합니다.
  2. LRCO 커밋.
  3. 트랜잭션 로그를 작성합니다.
  4. XA 트랜잭션을 커밋합니다.

절차가 2단계와 3단계 사이에 충돌하면 데이터 불일치로 이어질 수 있으며 XA 트랜잭션을 커밋할 수 없습니다. 데이터는 LRCO 비 XA 리소스가 커밋되었지만 XA 리소스 준비에 대한 정보는 기록되지 않았기 때문입니다. 복구 관리자는 서버가 가동된 후 리소스를 롤백합니다. CMR(커밋 표시 가능 리소스)은 이 제한을 제거하고 XA 트랜잭션에 비 XA 리소스를 안정적으로 열거할 수 있도록 합니다.

참고

CMR은 데이터 소스에만 사용해야 하는 LRCO 최적화의 특별한 사례입니다. XA가 아닌 모든 리소스에는 적합하지 않습니다.

11.3.2.1. 표시 가능한 리소스 커밋

요약

CMR(커밋 Markable Resource) 인터페이스를 사용하여 리소스 관리자에 대한 액세스를 구성하면 XA(2PC) 트랜잭션에 XA가 아닌 데이터 소스에 안정적으로 열거할 수 있습니다. XA 이외의 리소스를 완전히 복구할 수 있도록 하는 LRCO 알고리즘 구현입니다.

CMR을 구성하려면 다음을 수행해야 합니다.

  1. 데이터베이스에 테이블 만들기.
  2. 연결할 수 있도록 데이터 소스를 활성화합니다.
  3. 트랜잭션 하위 시스템에 참조를 추가합니다.
데이터베이스에서 테이블 만들기

트랜잭션에는 하나의 CMR 리소스만 포함될 수 있습니다. 다음 예제와 유사한 SQL을 사용하여 테이블을 생성할 수 있습니다.

SELECT xid,actionuid FROM _tableName_ WHERE transactionManagerID IN (String[])
DELETE FROM _tableName_ WHERE xid IN (byte[[]])
INSERT INTO _tableName_ (xid, transactionManagerID, actionuid) VALUES (byte[],String,byte[])

다음은 다양한 데이터베이스 관리 시스템의 테이블을 생성하는 SQL 구문의 예입니다.

예제: Sybase 테이블 구문 생성

CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))

예제: Oracle Create Table Syntax

CREATE TABLE xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)

예제: IBM Create Table Syntax

CREATE TABLE xids (xid VARCHAR(255) for bit data not null, transactionManagerID
varchar(64), actionuid VARCHAR(255) for bit data not null)
CREATE UNIQUE INDEX index_xid ON xids (xid)

예제: SQL Server Create Table Syntax

CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)

예제: PostgreSQL Create Table Syntax

CREATE TABLE xids (xid bytea, transactionManagerID varchar(64), actionuid bytea)
CREATE UNIQUE INDEX index_xid ON xids (xid)

예제: MariaDB 테이블 구문 생성

CREATE TABLE xids (xid BINARY(144), transactionManagerID varchar(64), actionuid BINARY(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)

예제: MySQL Create Table Syntax

CREATE TABLE xids (xid VARCHAR(255), transactionManagerID varchar(64), actionuid VARCHAR(255))
CREATE UNIQUE INDEX index_xid ON xids (xid)

연결할 수 있는 데이터 소스 활성화

기본적으로 데이터 소스에 대해 CMR 기능이 비활성화되어 있습니다. 이를 활성화하려면 데이터 소스 구성을 생성하거나 수정하고 연결 가능한 특성이 true 로 설정되어 있는지 확인해야 합니다. 다음은 서버 XML 구성 파일의 데이터 소스 섹션의 예입니다.

<datasource enabled="true" jndi-name="java:jboss/datasources/ConnectableDS" pool-name="ConnectableDS" jta="true" use-java-context="true" connectable="true"/>
참고

이 기능은 XA 데이터 소스에는 적용되지 않습니다.

다음과 같이 관리 CLI를 사용하여 CMR로 리소스 관리자를 활성화할 수도 있습니다.

/subsystem=datasources/data-source=ConnectableDS:add(enabled="true", jndi-name="java:jboss/datasources/ConnectableDS", jta="true", use-java-context="true", connectable="true", connection-url="validConnectionURL", exception-sorter-class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter", driver-name="mssql")

이 명령은 서버 구성 파일의 데이터 소스 섹션에 다음 XML을 생성합니다.

<datasource jta="true" jndi-name="java:jboss/datasources/ConnectableDS" pool-name="ConnectableDS" enabled="true" use-java-context="true" connectable="true">
  <connection-url>validConnectionURL</connection-url>
  <driver>mssql</driver>
  <validation>
    <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter"/>
  </validation>
</datasource>
참고

데이터 소스에 유효한 드라이버가 정의되어 있어야 합니다. 위의 예제에서는 mssqldriver-name 으로 사용하지만 mssql 드라이버는 존재하지 않습니다. 자세한 내용은 JBoss EAP 구성 가이드 의 MySQL 데이터 소스 예제 를 참조하십시오.

참고

데이터 소스 구성에서 exception-sorter-class-name 매개변수를 사용합니다. 자세한 내용은 JBoss EAP 구성 가이드의 데이터 소스 구성 예제 를 참조하십시오.

새로운 CMR 기능을 사용하도록 기존 리소스 업데이트

CMR 기능을 사용하도록 기존 데이터 소스만 업데이트해야 하는 경우 연결 가능한 속성을 수정하면 됩니다.

/subsystem=datasources/data-source=ConnectableDS:write-attribute(name=connectable,value=true)
Transactions 하위 시스템에 참조 추가

트랜잭션 하위 시스템은 아래와 같이 트랜잭션 하위 시스템 구성 섹션의 항목을 통해 CMR이 가능한 데이터 소스를 식별합니다.

<subsystem xmlns="urn:jboss:domain:transactions:5.0">
    ...
    <commit-markable-resources>
        <commit-markable-resource jndi-name="java:jboss/datasources/ConnectableDS">
            <xid-location name="xids" batch-size="100" immediate-cleanup="false"/>
        </commit-markable-resource>
        ...
    </commit-markable-resources>
</subsystem>

관리 CLI를 사용하여 동일한 결과를 얻을 수 있습니다.

/subsystem=transactions/commit-markable-resource=java\:jboss\/datasources\/ConnectableDS/:add(batch-size=100,immediate-cleanup=false,name=xids)
참고

트랜잭션 하위 시스템에서 CMR 참조를 추가한 후 서버를 다시 시작해야 합니다.