12.8. XA 데이터 소스 복구

XA 데이터 소스는 트랜잭션 관리자에 의해 조정되고 단일 트랜잭션에서 여러 리소스를 확장할 수 있는 XA 글로벌 트랜잭션에 참여할 수 있는 데이터 소스입니다. 참가자 중 한 명이 변경 사항을 커밋하지 못하면 다른 참가자가 트랜잭션을 중단하고 트랜잭션이 발생되기 전과 마찬가지로 해당 상태를 복원합니다. 이는 일관성을 유지하고 잠재적인 데이터 손실 또는 손상을 방지하기 위한 것입니다.

XA 복구는 리소스나 트랜잭션 참여자가 충돌하거나 사용할 수 없는 경우에도 트랜잭션의 영향을 받는 모든 리소스가 업데이트 또는 롤백되도록 하는 프로세스입니다. XA 복구는 사용자의 개입 없이 수행됩니다.

각 XA 리소스에는 해당 구성과 관련된 복구 모듈이 있어야 합니다. 복구 모듈은 복구를 수행할 때 실행되는 코드입니다. JBoss EAP는 JDBC XA 리소스에 대한 복구 모듈을 자동으로 등록합니다. 사용자 지정 복구 코드를 구현하려는 경우 XA 데이터 소스에 사용자 지정 모듈을 등록할 수 있습니다. 복구 모듈은 class com.arspringa.ats.jta.recovery.XAResource recoveryy를 확장해야 합니다.

12.8.1. XA 복구 구성

대부분의 JDBC 리소스에서 복구 모듈은 자동으로 리소스와 연결됩니다. 이 경우 복구 모듈을 리소스에 연결하여 복구를 수행할 수 있는 옵션만 구성해야 합니다.

다음 표에서는 XA 복구와 관련된 XA 데이터 소스 매개변수를 설명합니다. 이러한 각 구성 특성은 데이터 소스 생성 중에 또는 이후에 설정할 수 있습니다. 관리 콘솔 또는 관리 CLI를 사용하여 설정할 수 있습니다. XA 데이터 소스 구성에 대한 자세한 내용은 XA 데이터 소스 수정을 참조하십시오.

표 12.2. XA 복구를 위한 데이터 소스 매개변수

속성설명

recovery-username

복구를 위해 리소스에 연결하는 데 사용할 사용자 이름입니다. 이 값을 지정하지 않으면 데이터 소스 보안 설정이 사용됩니다.

recovery-password

복구를 위해 리소스에 연결하는 데 사용할 암호입니다. 이 값을 지정하지 않으면 데이터 소스 보안 설정이 사용됩니다.

recovery-security-domain

복구를 위해 리소스에 연결하는 데 사용할 보안 도메인입니다.

recovery-plugin-class-name

사용자 지정 복구 모듈을 사용해야 하는 경우 이 속성을 모듈의 정규화된 클래스 이름으로 설정합니다. 이 모듈은 class com.arspringa.ats.jta.recovery.XAResource recoveryy를 확장해야 합니다.

recovery-plugin-properties

속성을 설정해야 하는 사용자 지정 복구 모듈을 사용하는 경우 이 속성을 속성에 대해 쉼표로 구분된 KEY=VALUE 쌍 목록으로 설정합니다.

XA 복구 비활성화

여러 XA 데이터 소스가 동일한 물리적 데이터베이스에 연결되는 경우 일반적으로 해당 데이터베이스 중 하나에 대해서만 XA 복구를 구성해야 합니다.

다음 관리 CLI 명령을 사용하여 XA 데이터 소스에 대한 복구를 비활성화합니다.

/subsystem=datasources/xa-data-source=XA_DATASOURCE_NAME:write-attribute(name=no-recovery,value=true)

12.8.2. 벤더별 XA 복구

벤더별 구성

일부 데이터베이스에서는 JBoss EAP 트랜잭션 관리자가 관리하는 XA 트랜잭션에서 협업하기 위해 특정 구성이 필요합니다. 자세한 정보와 최신 정보는 데이터베이스 벤더의 설명서를 참조하십시오.

MySQL
특별한 설정은 필요하지 않습니다. 자세한 내용은 MySQL 설명서를 참조하십시오.
참고

자동화된 XA 복구를 위해 MySQL 8 이상에는 특수 구성이 필요합니다. 자세한 내용은 JBoss EAP 7.4 지원 구성을 참조하십시오.

PostgreSQL 및 Postgres Plus 고급 서버
PostgreSQL에서 XA 트랜잭션을 처리할 수 있으려면 구성 매개 변수 max_prepared_transactions0 보다 크거나 max_connections 보다 큰 값으로 변경합니다.
Oracle

Oracle 사용자 USER 가 복구에 필요한 테이블에 액세스할 수 있는지 확인합니다.

GRANT SELECT ON sys.dba_pending_transactions TO USER;
GRANT SELECT ON sys.pending_trans$ TO USER;
GRANT SELECT ON sys.dba_2pc_pending TO USER;
GRANT EXECUTE ON sys.dbms_xa TO USER;

Oracle 사용자에게 적절한 권한이 없는 경우 다음과 같은 오류가 표시될 수 있습니다.

WARN  [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery  got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR
Microsoft SQL Server
자세한 내용은 http://msdn.microsoft.com/en-us/library/aa342335.aspx 을 비롯한 Microsoft SQL Server 설명서를 참조하십시오.
IBM DB2
특별한 설정은 필요하지 않습니다. 자세한 내용은 IBM DB2 설명서를 참조하십시오.
Sybase

Sybase는 데이터베이스에서 XA 트랜잭션을 활성화할 것으로 예상합니다. 올바른 데이터베이스 구성이 없으면 XA 트랜잭션이 작동하지 않습니다. enable xact 조정 매개 변수는 Adaptive Server 트랜잭션 조정 서비스를 활성화 또는 비활성화합니다. 이 매개변수가 활성화되면 Adaptive Server는 원격 Adaptive Server 데이터 커밋을 업데이트하거나 원래 트랜잭션으로 롤백합니다.

트랜잭션 조정을 활성화하려면 다음을 사용합니다.

sp_configure 'enable xact coordination', 1
MariaDB
특별한 설정은 필요하지 않습니다. 자세한 내용은 MariaDB 설명서를 참조하십시오.
확인된 문제

XA 트랜잭션을 처리하는 데 이러한 알려진 문제는 JBoss EAP 7에서 지원하는 특정 데이터베이스 및 JDBC 드라이버 버전에 대한 것입니다. 지원되는 데이터베이스에 대한 최신 정보는 JBoss EAP에서 지원되는 구성을 참조하십시오.

MySQL
MySQL은 XA 트랜잭션을 완전히 처리할 수 없습니다. 클라이언트에서 MySQL의 연결이 끊어지면 이러한 트랜잭션에 대한 모든 정보가 손실됩니다. 자세한 내용은 MySQL 버그를 참조하십시오. 이 문제는 MySQL 5.7에서 해결되었습니다.
PostgreSQL 및 Postgres Plus 고급 서버

2-단계 커밋(2PC) 커밋 단계에서 네트워크 오류가 발생하면 JDBC 드라이버는 XAER_RMERR XAException 오류 코드를 반환합니다. 이 오류는 복구할 수 없는 치명적인 이벤트가 트랜잭션 관리자에게 신호를 보내지만, 트랜잭션은 데이터베이스 측의 문제 내부 상태로 유지되며, 네트워크 연결이 다시 설정된 후 쉽게 수정할 수 있습니다. 올바른 반환 코드는 XAER_RMFAIL 또는 XAER_RETRY 여야 합니다. 잘못된 오류 코드로 인해 트랜잭션이 JBoss EAP 측면의 Heuristic 상태로 유지되고 데이터베이스에 수동 조작이 필요한 잠금이 유지됩니다. 자세한 내용은 PostgreSQL 버그를 참조하십시오.

1단계 커밋 최적화를 사용할 때 연결 오류가 발생하면 JDBC 드라이버에서 XAER_RMERR 을 반환하지만 XAER_RMFAIL 오류 코드가 반환되어야 합니다. 이로 인해 데이터베이스가 1단계 커밋 중에 데이터를 커밋하고 해당 시점에 연결이 중단되는 경우 데이터 불일치가 발생할 수 있습니다. 그러면 클라이언트에 트랜잭션이 롤백되었음을 알립니다.

Postgres Plus JDBC 드라이버는 Postgres Plus Server에 있는 모든 준비 트랜잭션에 대해 XID를 반환하므로 XID가 속한 데이터베이스를 확인할 수 없습니다. JBoss EAP에서 동일한 데이터베이스에 대해 둘 이상의 데이터 소스를 정의하면 in-doubt 트랜잭션 복구 시도가 잘못된 계정으로 실행될 수 있으므로 복구가 실패할 수 있습니다.

Oracle

JDBC 드라이버는 일부 사용자 자격 증명으로 구성된 데이터 소스를 사용하여 복구를 호출할 때 데이터베이스 인스턴스의 모든 사용자에 속하는 XID를 반환합니다. JDBC 드라이버는 다른 사용자에 속하는 XID 복구를 시도하므로 지정된 트랜잭션으로 전환할 수 없습니다.

이 문제의 해결 방법은 FORCE ANY TRANSACTION 권한을 복구 데이터 소스 구성에 사용되는 사용자에게 부여하는 것입니다. 권한 구성에 대한 자세한 내용은 http://docs.oracle.com/database/121/ADMIN/ds_txnman.htm#ADMIN12259 에서 확인할 수 있습니다.

Microsoft SQL Server

2-단계 커밋(2PC) 커밋 단계에서 네트워크 오류가 발생하면 JDBC 드라이버는 XAER_RMERR XAException 오류 코드를 반환합니다. 이 오류는 복구할 수 없는 치명적인 이벤트가 트랜잭션 관리자에게 신호를 보내지만, 트랜잭션은 데이터베이스 측의 문제 내부 상태로 유지되며, 네트워크 연결이 다시 설정된 후 쉽게 수정할 수 있습니다. 올바른 반환 코드는 XAER_RMFAIL 또는 XAER_RETRY 여야 합니다. 잘못된 오류 코드로 인해 트랜잭션이 JBoss EAP 측면의 Heuristic 상태로 유지되고 데이터베이스에 수동 조작이 필요한 잠금이 유지됩니다. 자세한 내용은 Microsoft SQL Server 문제 보고서 를 참조하십시오.

1단계 커밋 최적화를 사용할 때 연결 오류가 발생하면 JDBC 드라이버에서 XAER_RMERR 을 반환하지만 XAER_RMFAIL 오류 코드가 반환되어야 합니다. 이로 인해 데이터베이스가 1단계 커밋 중에 데이터를 커밋하고 해당 시점에 연결이 중단되는 경우 데이터 불일치가 발생할 수 있습니다. 그러면 클라이언트에 트랜잭션이 롤백되었음을 알립니다.

IBM DB2
1단계 커밋 중에 연결 오류가 발생하면 JDBC 드라이버에서 XAER_RETRY 를 반환하지만 XAER_RMFAIL 오류 코드를 반환해야 합니다. 이로 인해 데이터베이스가 1단계 커밋 중에 데이터를 커밋하고 해당 시점에 연결이 중단되는 경우 데이터 불일치가 발생할 수 있습니다. 그러면 클라이언트에 트랜잭션이 롤백되었음을 알립니다.
Sybase

2-단계 커밋(2PC) 커밋 단계에서 네트워크 오류가 발생하면 JDBC 드라이버는 XAER_RMERR XAException 오류 코드를 반환합니다. 이 오류는 복구할 수 없는 치명적인 이벤트가 트랜잭션 관리자에게 신호를 보내지만, 트랜잭션은 데이터베이스 측의 문제 내부 상태로 유지되며, 네트워크 연결이 다시 설정된 후 쉽게 수정할 수 있습니다. 올바른 반환 코드는 XAER_RMFAIL 또는 XAER_RETRY 여야 합니다. 잘못된 오류 코드로 인해 트랜잭션이 JBoss EAP 측면의 Heuristic 상태로 유지되고 데이터베이스에 수동 조작이 필요한 잠금이 유지됩니다.

1단계 커밋 최적화를 사용할 때 연결 오류가 발생하면 JDBC 드라이버에서 XAER_RMERR 을 반환하지만 XAER_RMFAIL 오류 코드가 반환되어야 합니다. 이로 인해 데이터베이스가 1단계 커밋 중에 데이터를 커밋하고 해당 시점에 연결이 중단되는 경우 데이터 불일치가 발생할 수 있습니다. 그러면 클라이언트에 트랜잭션이 롤백되었음을 알립니다.

Sybase 트랜잭션 분기가 준비 상태에 있기 전에 Sybase 15.7 또는 16 데이터베이스에 대한 삽입이 포함된 XA 트랜잭션이 실패하는 경우 XA 트랜잭션을 반복하고 동일한 기본 키와 동일한 레코드를 삽입하면 com.sybase.jdbc4.jdbc.jdbc.SybSQLException 오류와 함께 실패합니다. 중복 키 행을 삽입합니다. 이 예외는 최종되지 않은 원래 Sybase 트랜잭션 분기가 롤백될 때까지 발생합니다.

MariaDB
MariaDB는 XA 트랜잭션을 완전히 처리할 수 없습니다. 클라이언트에서 MariaDB의 연결이 끊어지면 이러한 트랜잭션에 대한 모든 정보가 손실됩니다.
MariaDB Galera Cluster
MariaDB Galera 클러스터에서는 XA 트랜잭션이 지원되지 않습니다.