JBoss EAP에서 트랜잭션 관리

Red Hat JBoss Enterprise Application Platform 7.4

관리자가 Red Hat JBoss Enterprise Application Platform 트랜잭션 문제를 해결하기 위한 지침 및 정보.

Red Hat Customer Content Services

초록

이 문서에서는 관리자가 JBoss EAP에서 트랜잭션을 해결하는 데 필요한 정보를 제공합니다.

JBoss EAP 문서에 대한 피드백 제공

오류를 보고하거나 문서를 개선하기 위해 Red Hat Jira 계정에 로그인하여 문제를 제출하십시오. Red Hat Jira 계정이 없는 경우 계정을 생성하라는 메시지가 표시됩니다.

절차

  1. 티켓을 생성하려면 다음 링크를 클릭하십시오.
  2. 문서 URL, 섹션 번호 를 포함하고 문제를 설명하십시오.
  3. 요약 에 문제에 대한 간략한 설명을 입력합니다.
  4. 설명에서 문제 또는 개선 사항에 대한 자세한 설명을 제공합니다. 문서에서 문제가 발생한 위치에 URL을 포함합니다.
  5. Submit 을 클릭하고 문제를 적절한 문서 팀으로 라우팅합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

1장. JBoss EAP의 트랜잭션

트랜잭션은 성공하거나 모두 실패해야 하는 두 개 이상의 작업으로 구성됩니다. 성공적인 결과에 따라 커밋이 생성되고 실패한 결과에서 롤백이 발생합니다. 롤백에서는 트랜잭션이 커밋을 시도하기 전에 각 멤버의 상태가 복원됩니다.

1.1. 트랜잭션 하위 시스템

트랜잭션 하위 시스템을 사용하면 시간 제한 값, 트랜잭션 로깅, 통계 수집, 자카르타 트랜잭션 사용 여부와 같은 Transaction Manager(TM) 옵션을 구성할 수 있습니다. 트랜잭션 하위 시스템은 다음 네 가지 주요 요소로 구성됩니다.

핵심 환경
핵심 환경에는 JBoss EAP 서버가 관리 중인 리소스를 대신하여 트랜잭션 경계를 제어할 수 있도록 하는 tkn 인터페이스가 포함되어 있습니다. 트랜잭션 코디네이터는 트랜잭션에 참여하는 트랜잭션 개체 및 리소스와의 통신을 관리합니다.
복구 환경
JBoss EAP 트랜잭션 서비스의 복구 환경에서는 시스템이 트랜잭션의 결과를 트랜잭션의 영향을 받는 모든 리소스에 일관되게 적용하도록 합니다. 이 작업은 애플리케이션 프로세스 또는 이를 호스팅하는 시스템이 충돌하거나 네트워크 연결을 끊는 경우에도 계속됩니다.
코디네이터 환경
코디네이터 환경은 기본 시간 제한 및 로깅 통계와 같은 트랜잭션의 사용자 지정 속성을 정의합니다.
오브젝트 저장소
JBoss EAP 트랜잭션 서비스는 오브젝트 저장소를 사용하여 트랜잭션 결과를 영구적으로 기록하여 오류 복구를 지원합니다. 복구 관리자가 복구가 필요할 수 있는 트랜잭션 및 리소스에 대해 오브젝트 저장소 및 기타 정보 위치를 검사합니다.

1.2. 트랜잭션의 속성

잘 설계된 트랜잭션의 일반적인 표준은 원자성, 일관성, 격리 및 지속적(ACID)이라는 것입니다.

Atomic
트랜잭션의 모든 구성원은 트랜잭션을 커밋하거나 롤백하는 것과 동일한 결정을 내려야 합니다.
일관성
트랜잭션은 일관된 결과를 생성하고 애플리케이션 특정 불변성을 보존합니다.
격리
트랜잭션 범위를 벗어난 프로세스가 데이터를 수정하지 못하도록 에서 작동하는 데이터를 잠겨야 합니다.
Durable
치명적인 오류가 발생한 경우를 제외하고 커밋된 트랜잭션의 영향은 손실되지 않습니다.

1.3. 트랜잭션 구성 요소

트랜잭션 코디네이터
코디네이터는 트랜잭션 결과를 관리합니다. 클라이언트가 호출한 웹 서비스가 일관된 결과를 얻는지 확인해야 합니다.
트랜잭션 문맥
트랜잭션 컨텍스트는 전파된 트랜잭션에 대한 정보로, 이를 통해 여러 서비스에 걸쳐 트랜잭션을 수행할 수 있습니다.
트랜잭션 참가자
참가자는 참가자 모델을 사용하여 트랜잭션에 등록된 서비스입니다.
트랜잭션 서비스
트랜잭션 서비스는 기본 트랜잭션 프로토콜의 모델을 캡처하고 해당 모델에 따라 연결된 참가자와 조율합니다.
트랜잭션 API
Transaction API는 트랜잭션 구분 및 참가자의 등록을 위한 인터페이스를 제공합니다.

1.4. 트랜잭션 관리 원칙

1.4.1. XA Versus Non-XA 트랜잭션

XA가 아닌 트랜잭션에는 하나의 리소스만 포함됩니다. 트랜잭션 코디네이터가 없으며 단일 리소스가 모든 트랜잭션 작업을 수행합니다. 이를 로컬 트랜잭션이라고 합니다.

XA 트랜잭션에는 여러 리소스가 포함됩니다. 또한 하나 이상의 데이터베이스 또는 Jakarta Messaging과 같은 기타 리소스를 사용하여 트랜잭션 관리자를 조정하고 단일 트랜잭션에 참여합니다. 이를 글로벌 트랜잭션이라고 합니다.

2장. 트랜잭션 구성

2.1. 고유한 노드 식별자

고유한 노드 식별자를 사용하면 JBoss EAP에서 지정된 노드 식별자만 일치하는 트랜잭션 및 트랜잭션 상태를 복구할 수 있습니다. com.ar bootstrapa.ats.arspringa.nodeIdentifier 속성을 사용하여 노드 식별자를 설정할 수 있습니다.

2.1.1. 고유한 노드 식별자의 중요

XA 복구를 실행할 때 JBoss EAP 트랜잭션이 복구할 수 있는 Xid 유형을 구성해야 합니다. 각 Xid 에는 인코딩된 고유한 노드 ID가 있으며 JBoss EAP는 지정된 노드 식별자와 일치하는 트랜잭션 및 트랜잭션 상태만 복구합니다.

목록에 여러 값을 포함할 수 있는 JTAEnvironmentBean.xa recoveryyNodes 속성을 사용하여 노드 식별자를 구성할 수 있습니다.

주의

별표 "*" 값은 JBoss EAP가 노드 식별자에 관계없이 모든 트랜잭션을 복구하고 롤백할 수 있도록 합니다. 주의해서 사용해야 합니다.

com.arwona.ats.jta.xa recoveryNode 속성 값은 영숫자여야 하며 com.arouncea.ats.ar bootstrapa.nodeIdentifier 속성의 값과 일치해야 합니다.

2.2. 트랜잭션 관리자 구성

웹 기반 관리 콘솔 또는 명령줄 관리 CLI를 사용하여 트랜잭션 관리자를 구성할 수 있습니다.

관리 콘솔을 사용하여 트랜잭션 관리자 구성

다음 단계에서는 웹 기반 관리 콘솔을 사용하여 트랜잭션 관리자를 구성하는 방법을 설명합니다.

  1. 화면 상단에서 Configuration(구성 ) 탭을 선택합니다.
  2. JBoss EAP를 관리형 도메인으로 실행하는 경우 수정할 원하는 프로필을 선택합니다.
  3. Subsystem(하위 시스템 ) 목록에서 트랜잭션 을 선택하고 View(보기 )를 클릭합니다.
  4. 구성할 설정에 대한 적절한 탭(예: 복구 옵션)을 선택합니다.
  5. Edit(편집 )를 클릭하고 필요한 변경을 수행하고 Save(저장 )를 클릭하여 변경 사항을 저장합니다.

관리 CLI를 사용하여 트랜잭션 관리자 구성

관리 CLI를 사용하여 일련의 명령을 사용하여 트랜잭션 관리자를 구성할 수 있습니다. 이 명령은 모두 관리형 도메인의 기본 프로필에 대해 독립 실행형 서버에 대해 /subsystem=transactions 또는 /profile=default/subsystem=transactions/ 로 시작합니다.

모든 트랜잭션 관리자 구성 옵션의 자세한 목록은 JBoss EAP의 Transaction Manager 구성 옵션을 참조하십시오.

2.3. 시스템 속성을 사용하여 트랜잭션 관리자 구성

관리 콘솔, 관리 CLI 또는 시스템 속성을 사용하여 많은 트랜잭션 관리자 옵션을 구성할 수 있습니다. 그러나 다음 옵션은 시스템 속성을 사용하는 경우에만 구성할 수 있습니다. 관리 CLI 또는 관리 콘솔을 사용하여 구성할 수 없습니다.

속성 이름설명

RecoveryEnvironmentBean.periodicRecoveryPeriod

복구 시도 간격(초)입니다.

  • 반드시 양수 정수여야 합니다.
  • 기본값은 120초(2분)입니다.

RecoveryEnvironmentBean.recoveryBackoffPeriod

첫 번째와 두 번째 복구 사이의 간격(초)입니다.

  • 반드시 양수 정수여야 합니다.
  • 기본값은 10초입니다.

RecoveryEnvironmentBean.periodicRecoveryInitilizationOffset

첫 번째 복구 통과 전 간격(초)입니다.

  • 0 또는 양수 정수여야 합니다.
  • 기본값은 0초입니다.

RecoveryEnvironmentBean.expiryScanInterval

만료 검사 간 간격(시간).

  • 모든 정수일 수 있습니다.
  • 0은 스캔을 비활성화합니다.
  • 음수 값은 첫 번째 실행을 연기합니다.
  • 기본값은 12시간입니다.

이 예에서는 standalone.xml 서버 구성 파일에서 이러한 시스템 속성을 구성하는 방법을 보여줍니다.

<system-properties>
    <property name="RecoveryEnvironmentBean.periodicRecoveryPeriod" value="180"/>
    <property name="RecoveryEnvironmentBean.recoveryBackoffPeriod" value="20"/>
    <property name="RecoveryEnvironmentBean.periodicRecoveryInitilizationOffset" value="5"/>
    <property name="RecoveryEnvironmentBean.expiryScanInterval" value="24"/>
</system-properties>

시스템 속성 구성 방법에 대한 자세한 내용은 구성 가이드의 시스템 속성을 참조하십시오.

2.4. 자카르타 트랜잭션을 사용하도록 데이터 소스 구성

이 작업은 데이터 소스에서 자카르타 트랜잭션을 활성화하는 방법을 보여줍니다.

사전 요구 사항

  • 데이터베이스는 자카르타 트랜잭션을 지원해야 합니다. 자세한 내용은 데이터베이스 벤더의 설명서를 참조하십시오.
참고

구성 가이드에 설명된 XA 데이터 소스는 기본적으로 사용할 수 있는 자카르타 트랜잭션입니다.

자카르타 트랜잭션을 사용하도록 데이터 소스 구성

  1. 다음 관리 CLI 명령을 사용하여 jta 특성을 true 로 설정합니다.

    /subsystem=datasources/data-source=DATASOURCE_NAME:write-attribute(name=jta,value=true)
    참고

    관리형 도메인에서 이 명령 앞에 /profile=PROFILE_NAME 이 있습니다.

  2. 변경 사항을 적용하려면 서버를 다시 로드합니다.

    reload

이제 데이터 소스가 자카르타 트랜잭션을 사용하도록 구성되어 있습니다.

2.5. JTS에 대한 ORB 구성

JBoss EAP의 기본 설치에서는 트랜잭션에 대한 ORB(Object Request Broker) 지원이 비활성화됩니다. 관리 CLI 또는 관리 콘솔을 사용하여 iiop-openjdk 하위 시스템에서 ORB 설정을 구성할 수 있습니다.

참고

관리형 도메인에서 full 또는 full -ha 프로필을 사용하거나 독립 실행형 서버에 대해 standalone- full.xml 또는 standalone-full- ha.xml 구성 파일을 사용하는 경우 iiop- openjdk 하위 시스템을 사용할 수 있습니다.

iiop-openjdk 하위 시스템에서 사용 가능한 구성 옵션 목록은 구성 가이드의 IIOP 하위 시스템 속성 에서 참조하십시오.

관리 CLI를 사용하여 ORB 구성

관리 CLI를 사용하여 ORB의 각 측면을 구성할 수 있습니다. 이는 JTS와 함께 ORB를 사용하는 최소 구성입니다.

full 프로필을 사용하여 관리형 도메인에 대해 다음 관리 CLI 명령을 구성할 수 있습니다. 필요한 경우 구성해야 하는 프로필에 맞게 프로필을 변경합니다. 독립 실행형 서버를 사용하는 경우 명령의 /profile=full 부분을 생략합니다.

보안 인터셉터 활성화

값을 identity 로 설정하여 security 속성을 활성화합니다.

/profile=full/subsystem=iiop-openjdk:write-attribute(name=security,value=identity)
IIOP 하위 시스템에서 트랜잭션 활성화

JTS에 ORB를 사용하려면 트랜잭션 속성 값을 기본 사양이 아닌 full 로 설정합니다.

/profile=full/subsystem=iiop-openjdk:write-attribute(name=transactions, value=full)
Transactions 하위 시스템에서 JTS 활성화
/profile=full/subsystem=transactions:write-attribute(name=jts,value=true)
참고

JTS 활성화의 경우 다시 로드할 수 없기 때문에 서버를 다시 시작해야 합니다.

관리 콘솔을 사용하여 ORB 구성

  1. 관리 콘솔 상단에서 Configuration(구성 ) 탭을 선택합니다. 관리형 도메인에서 수정할 적절한 프로필을 선택해야 합니다.
  2. 하위 시스템IIOP(OpenJDK) 를 선택하고 보기를 클릭합니다.
  3. Edit(편집 )를 클릭하고 필요한 경우 속성을 수정합니다.
  4. Save(저장 )를 클릭하여 변경 사항을 저장합니다.

3장. 트랜잭션 관리

3.1. 트랜잭션 검색

관리 CLI는 트랜잭션 레코드를 검색하고 조작하는 기능을 지원합니다. 이 기능은 JBoss EAP의 IC 및 관리 API 간의 상호 작용을 통해 제공됩니다.

트랜잭션 관리자는 보류 중인 각 트랜잭션에 대한 정보와 관련된 참가자를 오브젝트 저장소라는 영구 스토리지에 저장합니다. 관리 API는 오브젝트 저장소를 log-store 라는 리소스로 노출합니다. 프로브 작업은 트랜잭션 로그를 읽고 각 레코드의 노드 경로를 생성합니다. 로그 저장소 를 새로 고쳐야 할 때마다 프로브 작업을 수동으로 호출할 수 있습니다. 트랜잭션 로그가 신속하게 표시되고 사라지는 것은 정상입니다.

로그 저장소 새로 고침

다음 명령은 관리형 도메인에서 default 프로필을 사용하는 서버 그룹의 로그 저장소를 새로 고칩니다. 독립 실행형 서버의 경우 명령에서 profile=default 를 제거합니다.

/profile=default/subsystem=transactions/log-store=log-store:probe

준비된 모든 트랜잭션 보기

준비된 모든 트랜잭션을 보려면 먼저 로그 저장소를 새로 고치고 파일 시스템 ls 명령과 유사하게 작동하는 다음 명령을 실행합니다.

ls /profile=default/subsystem=transactions/log-store=log-store/transactions

또는

/host=master/server=server-one/subsystem=transactions/log-store=log-store:read-children-names(child-type=transactions)

각 트랜잭션은 고유 식별자와 함께 표시됩니다. 개별 작업은 개별 트랜잭션에 대해 실행할 수 있습니다. 자세한 내용은 트랜잭션 관리를 참조하십시오.

3.2. 트랜잭션 관리

트랜잭션 속성 보기

Java Naming and Directory Interface 이름, EIS 제품 이름 및 버전 또는 해당 상태와 같은 트랜잭션에 대한 정보를 보려면 read-resource 작업을 사용합니다.

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resource

트랜잭션 참가자 세부 정보 보기

각 트랜잭션 로그에는 participants 라는 하위 요소가 포함되어 있습니다. 이 요소에서 read-resource 작업을 사용하여 트랜잭션 참여자의 세부 정보를 확인합니다. 참가자는 Java 네이밍 및 디렉터리 인터페이스 이름으로 식별됩니다.

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resource

결과는 다음과 유사할 수 있습니다.

{
   "outcome" => "success",
   "result" => {
       "eis-product-name" => "ActiveMQ",
       "eis-product-version" => "2.0",
       "jndi-name" => "java:/JmsXA",
       "status" => "HEURISTIC",
       "type" => "/StateManager/AbstractRecord/XAResourceRecord"
   }
}

여기에 표시된 결과 상태는 HEURISTIC 상태이며 복구 대상입니다. 자세한 내용은 트랜잭션 참가자 복구를 참조하십시오.

특별한 경우 로그에 해당 트랜잭션 레코드가 없는 XAResourceRecords인 오브젝트 저장소에서 고립 레코드를 만들 수 있습니다. 예를 들어, XA 리소스가 준비되었지만 기록된 리소스가 충돌하기 전에 충돌했으며 도메인 관리 API에서 액세스할 수 없습니다. 이러한 레코드에 액세스하려면 관리 옵션 expose-all-logstrue 로 설정해야 합니다. 이 옵션은 관리 모델에 저장되지 않으며, 서버를 다시 시작할 때 false 로 복원됩니다.

/profile=default/subsystem=transactions/log-store=log-store:write-attribute(name=expose-all-logs, value=true)

이 대체 명령을 사용하면 트랜잭션의 참가자 ID를 집계된 형식으로 표시할 수 있습니다.

/host=master/server=server-one/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-children-names(child-type=participants)

트랜잭션 참가자 삭제

각 트랜잭션 로그는 삭제 작업을 지원하여 트랜잭션을 나타내는 트랜잭션 로그를 삭제합니다.

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:delete

그러면 트랜잭션의 모든 참가자도 삭제됩니다.

주의

일반적으로 참가자 로그 관리는 복구 시스템 또는 해당 시스템을 소유하는 트랜잭션 로그에 그대로 두지만 삭제 작업은 안전하게 수행할 수 있습니다. 복구가 완료된 XA 리소스의 경우 기 호출이 트리거되어 XA 리소스 공급업체 로그가 올바르게 정리됩니다. 이 잊고 호출이 실패해도 기본적으로 삭제 작업이 성공적으로 수행됩니다. ObjectStoreEnvironmentBean.ignoreMBeanHeuristics 시스템 속성을 false로 설정하여 이 동작을 재정의할 수 있습니다.

트랜잭션 참가자 복구

각 트랜잭션 참여자는 복구 작업을 사용하여 복구를 지원합니다.

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recover

트랜잭션 참가자의 상태가 HEURISTIC 인 경우 복구 작업은 상태를 PREPARE 로 전환하고 주기적인 복구 프로세스에 커밋을 재생합니다.

커밋에 성공하면 참가자가 트랜잭션 로그에서 제거됩니다. 로그 저장소에서 프로브 작업을 실행하고 참가자가 더 이상 나열되지 않는지 확인하여 이를 확인할 수 있습니다. 마지막 참가자인 경우 트랜잭션도 삭제됩니다.

트랜잭션 참가자의 상태 새로 고침

트랜잭션에 복구가 필요한 경우 복구를 시도하기 전에 새로 고침 작업을 사용하여 복구가 필요한지 확인할 수 있습니다.

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:refresh

3.3. 트랜잭션 통계 보기

트랜잭션 관리자 통계가 활성화된 경우 트랜잭션 관리자가 처리한 트랜잭션에 대한 통계를 볼 수 있습니다. 트랜잭션 관리자 통계를 활성화하는 방법에 대한 정보는 JBoss EAP 구성 가이드 의 트랜잭션 관리자 구성 섹션을 참조하십시오.

관리 콘솔 또는 관리 CLI를 사용하여 통계를 볼 수 있습니다. 관리 콘솔에서 런타임 탭에서 트랜잭션 하위 시스템으로 이동하여 트랜잭션 통계를 사용할 수 있습니다. 관리 CLI에서 read-resource 작업에 include-runtime=true 를 사용하여 통계를 볼 수 있습니다. 예를 들면 다음과 같습니다.

/subsystem=transactions:read-resource(include-runtime=true)

다음 표는 각 트랜잭션 통계에 대한 관리 콘솔 표시 이름, 관리 CLI 특성 및 설명을 보여줍니다.

표 3.1. 트랜잭션 하위 시스템 통계

이름 표시속성설명

중단됨

정렬된 트랜잭션 수

중단된 트랜잭션 수입니다.

애플리케이션 오류

number-of-application-rollbacks

오류 발생이 애플리케이션인 시간 초과를 포함한 실패한 트랜잭션 수입니다.

평균 커밋 시간

average-commit-time

클라이언트에서 트랜잭션 관리자가 성공적인 것으로 판단할 때까지 커밋을 호출할 때 측정된 평균 트랜잭션 커밋 시간(나노초)입니다.

커밋됨

number-of-committed-transactions

커밋된 트랜잭션 수입니다.

상속

number-of-heuristics

추론 상태의 트랜잭션 수입니다.

진행 중인 트랜잭션

number-of-inflight-transactions

시작되었지만 아직 종료되지 않은 트랜잭션 수입니다.

중첩 트랜잭션

number-of-nested-transactions

생성된 총 중첩 트랜잭션 수입니다.

트랜잭션 수

트랜잭션 수

중첩을 포함하여 생성된 총 트랜잭션 수입니다.

리소스 오류

number-of-resource-rollbacks

오류 발생이 리소스인 실패한 트랜잭션 수입니다.

시스템 오류

number-of-system-rollbacks

내부 시스템 오류로 인해 롤백된 트랜잭션 수입니다.

시간 초과

number-of-timed-out-transactions

시간 초과로 인해 롤백된 트랜잭션 수입니다.

3.4. 트랜잭션 오브젝트 저장소 구성

트랜잭션에는 오브젝트를 저장할 위치가 필요합니다. 개체 스토리지의 옵션 중 하나는 JDBC 데이터 소스입니다. 성능이 특정 우려인 경우 JDBC 오브젝트 저장소는 파일 시스템 또는 ActiveMQ 저널 오브젝트 저장소보다 느려질 수 있습니다.

중요

트랜잭션 하위 시스템이 트랜잭션 로그의 스토리지 유형으로 Apache ActiveMQ Artemis 저널을 사용하도록 구성된 경우 JBoss EAP의 두 인스턴스는 저널 저장에 동일한 디렉터리를 사용할 수 없습니다. 애플리케이션 서버 인스턴스는 동일한 위치를 공유할 수 없으며 각각 고유한 위치를 구성해야 합니다.

참고

트랜잭션 오브젝트 저장소가 손실되면 데이터 일관성이 손실될 수 있습니다. 따라서 오브젝트 저장소를 안전한 드라이브에 배치해야 합니다.

JDBC 데이터 소스를 트랜잭션 오브젝트 저장소로 사용

JDBC 데이터 소스를 트랜잭션 오브젝트 저장소로 사용하려면 다음 단계를 따르십시오.

  1. 데이터 소스를 만듭니다(예: TransDS ). XA가 아닌 데이터 소스에 대한 지침은 JBoss EAP 구성 가이드의 Create a Non-XA datasource 섹션을 참조하십시오. 개체 저장소가 제대로 작동하려면 데이터 소스의 JDBC 드라이버를 JAR 배포가 아닌 JBoss EAP 구성 가이드에 설명된 대로 코어 모듈로 설치해야 합니다.
  1. 데이터 소스의 jta 특성을 false로 설정합니다.

    /subsystem=datasources/data-source=TransDS:write-attribute(name=jta, value=false)
  2. 데이터 소스에서 사용할 Java Naming 및 Directory Interface 이름(예 : java:jboss/datasources/TransDS)으로 thejdbc-store- datasources 속성을 설정합니다.

    /subsystem=transactions:write-attribute(name=jdbc-store-datasource, value=java:jboss/datasources/TransDS)
  3. use-jdbc-store 특성을 true로 설정합니다.

    /subsystem=transactions:write-attribute(name=use-jdbc-store, value=true)
  4. 변경 사항을 적용하려면 JBoss EAP 서버를 다시 시작하십시오.

트랜잭션 JDBC 스토어 속성

다음 표는 JDBC 오브젝트 스토리지와 관련된 사용 가능한 모든 특성을 식별합니다.

참고

이 테이블의 특성 이름은 관리 CLI를 사용하는 경우와 같이 관리 모델에 표시되는 대로 나열됩니다. 관리 모델과 다를 수 있으므로 EAP_HOME/docs/schema/wildfly-txn_4_0.xsd 에 있는 스키마 정의 파일을 참조하여 XML에 표시되는 요소를 확인합니다.

표 3.2. 트랜잭션용 JDBC 스토어 속성

속성설명

use-jdbc-store

트랜잭션에 대한 JDBC 저장소를 활성화하려면 이 값을 true 로 설정합니다.

jdbc-store-datasource

스토리지에 사용되는 JDBC 데이터 소스의 Java 네이밍 및 디렉터리 인터페이스 이름입니다.

jdbc-action-store-drop-table

시작 시 작업 저장소 테이블을 삭제하고 다시 생성할지 여부. 기본값은 false입니다.

jdbc-action-store-table-prefix

작업 저장소 테이블 이름에 대한 접두사입니다.

jdbc-communication-store-drop-table

시작 시 통신 저장소 테이블을 삭제하고 재생성할지 여부입니다. 기본값은 false입니다.

jdbc-communication-store-table-prefix

통신 저장소 테이블 이름의 접두사입니다.

jdbc-state-store-drop-table

시작 시 상태 저장소 테이블을 삭제하고 다시 생성할지 여부입니다. 기본값은 false입니다.

jdbc-state-store-table-prefix

상태 저장소 테이블 이름의 접두사입니다.

ActiveMQ 저널 오브젝트 저장소 사용

ActiveMQ 저널 오브젝트 저장소를 사용하려면 다음 단계를 따르십시오.

  1. use-journal-store 특성을 true로 설정합니다.

    /subsystem=transactions:write-attribute(name=use-journal-store,value=true)
  2. 변경 사항을 적용하려면 JBoss EAP 서버를 다시 시작하십시오.

4장. 트랜잭션 모니터링

4.1. 트랜잭션 하위 시스템에 대한 로깅 구성

JBoss EAP의 다른 로깅 설정과는 관계없이 트랜잭션에 대해 기록되는 정보의 양을 제어할 수 있습니다. 관리 콘솔 또는 관리 CLI를 사용하여 로깅 설정을 구성할 수 있습니다.

관리 콘솔을 사용하여 트랜잭션 로거 구성

  1. 로깅 하위 시스템 구성으로 이동합니다.

    1. 관리 콘솔에서 Configuration (구성) 탭을 클릭합니다. 관리형 도메인을 사용하는 경우 적절한 서버 프로필을 선택해야 합니다.
    2. 하위 시스템로깅구성을 선택하고 보기를 클릭합니다.
  2. com.ar subcommanda 속성을 편집합니다.

    Categories(범주 ) 탭을 선택합니다. com.arounce a 항목이 이미 있습니다. com.ar subcommanda를 선택하고 Edit(편집 )를 클릭합니다. 로그 수준을 변경하고 상위 핸들러를 사용할지 여부를 선택할 수 있습니다.

    • 로그 수준:

      트랜잭션에서 많은 로깅 출력을 생성할 수 있으므로, 서버 로그가 트랜잭션 출력에 부담되지 않도록 기본 로깅 수준이 WARN 으로 설정됩니다. 트랜잭션 처리 세부 정보를 확인해야 하는 경우 트랜잭션 ID를 표시하도록 TRACE 로그 수준을 사용합니다.

    • 상위 핸들러 사용:

      상위 핸들러는 로거에서 출력을 상위 로거에 보내야 하는지를 나타냅니다. 기본 동작은 true 입니다.

  3. Save(저장 )를 클릭하여 변경 사항을 저장합니다.

관리 CLI를 사용하여 트랜잭션 로거 구성

다음 명령을 사용하여 관리 CLI에서 로깅 수준을 설정합니다. 독립 실행형 서버의 경우 명령에서 /profile=default 를 제거합니다.

/profile=default/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=VALUE)

4.1.1. TRACE 로그 수준 활성화

TRACE 로깅 수준은 JBoss EAP에서 Jakarta Connectors 문제를 진단할 수 있도록 로그에 데이터를 추가합니다. 다음 절차에서는 org.jboss. jca,org.jboss.as. connector 및 com.arounce a 클래스에 대해 TRACE 수준 로깅을 활성화하는 방법을 보여줍니다.

사전 요구 사항

  • JBoss EAP를 설치했습니다.

절차

  1. 터미널을 엽니다.
  2. 관리 CLI를 시작합니다.
  3. 다음 옵션 중 하나를 선택하십시오.

    • 관리형 도메인에서 다음 명령을 사용하여 org.jboss. jca,org.jboss. as.connector 및 com. arubia 클래스의 TRACE 로깅 수준을 활성화합니다.

      /profile=<PROFILE NAME>/subsystem=logging/logger=org.jboss.jca:add(level=TRACE)
      /profile=<PROFILE NAME>/subsystem=logging/logger=org.jboss.as.connector:add(level=TRACE)
      /profile=<PROFILE NAME>/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=TRACE)

      <PROFILE NAME> 을 JBoss EAP 프로필인 default,full 또는 full -ha 로 바꿉니다.

    • JBoss EAP를 독립 실행형 서버로 실행하는 경우 다음 명령을 사용하여 org.jboss. jca,org.jboss.as. connector 및 com. ar disastera 클래스의 TRACE 로깅 수준을 활성화합니다.

      /subsystem=logging/logger=org.jboss.jca:add(level=TRACE)
      /subsystem=logging/logger=org.jboss.as.connector:add(level=TRACE)
      /subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=TRACE)

      선택적으로 다음 명령을 사용하여 console-handler 클래스에서 TRACE 로깅 수준을 활성화합니다.

      /subsystem=logging/console-handler=CONSOLE:write-attribute(name=level,value=TRACE)

      코드 조각은 적절한 구성 파일에 추가됩니다.

      <logger category="com.arjuna">
        <level name="TRACE"/>
      </logger>
      
      <logger category="org.jboss.jca">
        <level name="TRACE"/>
      </logger>
      <logger category="org.jboss.as.connector">
        <level name="TRACE"/>
      </logger>

4.1.2. 트랜잭션 브리지 로거 활성화

트랜잭션 브리지는 XTS 상단에 있는 계층이며 트랜잭션 관리자의 자카르타 트랜잭션 또는 JTS 구성 요소 위에 계층입니다. JBoss EAP 서버의 다른 부분과 상호 작용합니다. 시스템 작업에 대한 자세한 설명을 위해 Transaction Manager와 상호 작용하는 이러한 구성 요소의 자세한 로깅을 활성화할 수 있습니다.

트랜잭션 브리지는 로깅 하위 시스템을 사용합니다. JBoss EAP 서버를 실행할 때 로깅은 standalone-xts.xml 파일의 로깅 하위 시스템 구성에서 구성됩니다. 트랜잭션 브리지의 로깅은 디버깅 목적으로 유용합니다.

다음 관리 CLI 명령을 사용하여 트랜잭션 브리지 로깅을 활성화하도록 org.jbossts.txbridge 로거를 구성할 수 있습니다.

/subsystem=logging/logger=org.jboss.jbossts.txbridge:add(level=ALL)

서버 구성 파일에 다음 XML이 생성됩니다.

<logger category="org.jboss.jbossts.txbridge">
  <level name="ALL" />
</logger>
참고

배포 순서 문제로 인해 트랜잭션 브리지를 포함하여 로깅 하위 시스템을 완전히 구성하기 전에 Transaction Manager 구성 요소가 활성화될 수 있습니다. 이 경우 기본 로깅 수준이 시작 중에 적용되므로 자세한 디버그 메시지가 누락됩니다.

다음 관리 CLI 명령을 사용하여 자세한 로깅을 활성화하도록 com.arouncea 로거 를 구성할 수 있습니다.

/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=ALL)

서버 구성 파일에 다음 XML이 생성됩니다.

<logger category="com.arjuna">
  <level name="ALL" />
</logger>

4.1.3. 트랜잭션 로그 메시지

트랜잭션 로거에 DEBUG 로그 수준을 사용하여 로그 파일을 읽기 쉽게 유지하면서 트랜잭션 상태를 추적할 수 있습니다. 자세한 디버깅은 TRACE 로그 수준을 사용합니다. 트랜잭션 로거 구성에 대한 정보는 트랜잭션 하위 시스템의 로깅 구성을 참조하십시오.

TRACE 로그 레벨에 로그인하도록 구성된 경우 트랜잭션 관리자(TM)는 많은 로깅 정보를 생성할 수 있습니다. 다음은 가장 일반적으로 표시되는 몇 가지 메시지입니다. 이 목록은 포괄적이지 않으므로 이 이외의 메시지를 볼 수 있습니다.

표 4.1. 트랜잭션 상태 변경

트랜잭션 시작

트랜잭션이 시작되면, action-id <transaction uid> 메시지 Basic Action::Begin()을 사용하여 로그에 com.arwona.ats.arwona.coordinator.Basic Action 메서드가 실행됩니다.

트랜잭션 커밋

트랜잭션 커밋 시, action-id <transaction uid> 메시지 Basic Action::Commit()를 사용하여 로그에 com.arwona.ats.arspringa.coordinator.Basic Action 메서드가 실행됩니다.

트랜잭션 롤백

트랜잭션이 롤백되면 class com.arspringa.ats.arspringa.coordinator.BasicAction 의 메서드 롤백 이 실행되어 action-id <transaction uid>의 메시지 BasicAction::Rollback() 을 사용하여 로그에 표시됩니다.

트랜잭션 시간 제한

트랜잭션 시간이 초과되면 com.arspringa.at s.arspringa.coordinator.TransactionReaper 가 실행되어 Reaper Worker <thread id>로 로그에 <transaction uid> 라는 메서드가 표시됩니다. 그러면 위와 같이 트랜잭션을 롤백하는 것과 동일한 스레드가 표시됩니다.

4.1.4. 트랜잭션 로그 파일 디코딩

4.1.4.1. 트랜잭션의 XID/UID 찾기

javax.transaction.TransactionManager 인터페이스는 트랜잭션 식별자를 찾는 두 가지 방법을 제공합니다.

  • toString 메서드를 호출하여 식별자를 포함한 트랜잭션에 대한 전체 정보를 출력할 수 있습니다.
  • 또는 javax.transaction.Transaction 인스턴스를 com. arspringa.ats.jta.transaction.Transaction 으로 사용한 다음 ArtributoraCore Uid 표현을 반환하는 get_uid 메서드를 호출하거나 분기 한정자가 아닌 글로벌 식별자에 대해 Xid를 반환하는 getTxId 메서드를 호출할 수 있습니다.

    com.arjuna.ats.jta.transaction.Transaction arjunaTM = (com.arjuna.ats.jta.transaction.Transaction)tx.getTransaction();
    System.out.println("Transaction UID" +arjunaTM.get_uid());

4.1.4.2. 트랜잭션 상태 및 리소스 찾기

TransactionStatusConnectionManager

TransactionStatusConnectionManager 오브젝트는 복구 모듈에서 트랜잭션 상태를 검색하는 데 사용됩니다. TransactionStatus Connector 오브젝트 테이블을 유지 관리하여 TransactionStatusManager 오브젝트의 프록시 역할을 하며, 각각 애플리케이션 프로세스의 TransactionStatusManager 오브젝트에 연결됩니다.

트랜잭션 Uid를 사용하고 사용 가능한 경우 트랜잭션 유형을 매개 변수로 사용하는 getTransactionStatus 메서드를 사용하여 트랜잭션 상태를 검색할 수 있습니다.

  1. 트랜잭션 Uid 매개변수의 프로세스 Uid 필드는 트랜잭션 오브젝트 저장소에서 타겟 TransactionStatusManagerItem 호스트 포트 쌍을 조회하는 데 사용됩니다.
  2. host-port 쌍은 TransactionStatus Connector 오브젝트를 사용하여 타겟 TransactionStatusManager 오브젝트에 TCP를 연결하는 데 사용됩니다.
  3. TransactionStatusConnector 는 트랜잭션 상태를 검색하기 위해 트랜잭션 Uid 및 트랜잭션 유형을 TransactionStatusManager 에 전달합니다.

다음 코드 예제에서는 TransactionStatusConnectionManager 를 검색하고 트랜잭션 상태를 확인하는 방법을 보여줍니다.

// Transaction id
Uid tx = new Uid();
. . . .
TransactionStatusConnectionManager tscm = new TransactionStatusConnectionManager();

// Check if the transaction aborted
assertEquals(tscm.getTransactionStatus(tx), ActionStatus.ABORTED);
TransactionStatusManager

TransactionStatusManager 오브젝트는 복구 관리자의 인터페이스 역할을 하여 실행 중인 애플리케이션 프로세스에서 트랜잭션 상태를 가져옵니다. 애플리케이션 프로세스당 하나의 TransactionStatusManagercom.arspringa.ats.arspringa.coordinator.TxControl 클래스에 의해 생성됩니다. TCP 연결은 복구 관리자와 TransactionStatusManager 간의 통신에 사용됩니다. 사용 가능한 포트는 기본적으로 TransactionStatusManager 에서 사용합니다. 그러나 사용되는 포트는 다음과 같은 특성을 사용하여 수정할 수 있습니다.

$ EAP_HOME/bin/standalone.sh -DRecoveryEnvironmentBean.transactionStatusManagerPort=NETWORK_PORT_NUMBER
  1. 생성 시 TransactionStatusManager 는 오브젝트 저장소에 있는 호스트와 함께 TransactionStatusManagerItem 으로 저장된 포트를 가져옵니다.
  2. TransactionStatusConnector 의 연결 요청을 기다리는 리스너 스레드가 시작됩니다.
  3. 연결이 설정되면 AtomicActionStatusService 서비스를 실행하는 연결 스레드가 생성됩니다. 이 서비스는 TransactionStatusConnector 오브젝트에서 트랜잭션 Uid 및 트랜잭션 유형(사용 가능한 경우)을 허용합니다.
  4. 트랜잭션 상태는 로컬 트랜잭션 테이블에서 가져와 TransactionStatusConnector 오브젝트로 다시 반환됩니다.

4.1.4.3. 트랜잭션 내역 보기

기본적으로 트랜잭션 서비스는 트랜잭션에 대한 기록을 유지 관리하지 않습니다. 그러나 트랜잭션 서비스에서 생성된 트랜잭션 수와 해당 결과에 대한 정보를 유지 관리하기 위해 CoordinatorEnvironmentBean.enableStatistics 속성 변수를 true 로 설정할 수 있습니다.

다음 관리 CLI 명령을 사용하여 통계를 활성화할 수 있습니다.

/subsystem=transactions:write-attribute(name=enable-statistics,value=true)

com.arspringa.ats.arspringa.coordinator.TxStats 클래스를 사용하여 프로그래밍 방식으로 더 자세한 트랜잭션 통계를 얻을 수 있습니다.

예제: TxStats 클래스

public class TxStats
{
    /**
     * @return the number of transactions (top-level and nested) created so far.
     */

    public static int numberOfTransactions();

    /**
     * @return the number of nested (sub) transactions created so far.
     *

     public static int numberOfNestedTransactions();

     /**
     * @return the number of transactions which have terminated with heuristic
     *         outcomes.
     */

    public static int numberOfHeuristics();
    /**
     * @return the number of committed transactions.
     */

    public static int numberOfCommittedTransactions();

    /**
     * @return the total number of transactions which have rolled back.
     */

    public static int numberOfAbortedTransactions();

    /**
     * @return total number of inflight (active) transactions.
     */

    public static int numberOfInflightTransactions ();

    /**
     * @return total number of transactions rolled back due to timeout.
     */

    public static int numberOfTimedOutTransactions ();
    /**
     * @return the number of transactions rolled back by the application.
     */

    public static int numberOfApplicationRollbacks ();

    /**
     * @return number of transactions rolled back by participants.
     */

    public static int numberOfResourceRollbacks ();

    /**
     * Print the current information.
     */

    public static void printStatus(java.io.PrintWriter pw);
}

현재 활성 트랜잭션 목록을 반환하는 getNumberOfInflightTransactions 메서드를 사용하여 특정 활성 트랜잭션에 대한 자세한 정보를 제공합니다.

5장. 트랜잭션 관리자 예외 처리

5.1. 시간 초과 트랜잭션 디버깅

트랜잭션 시간 제한에는 다음과 같은 여러 이유가 있을 수 있습니다.

  • 서버 성능 저하
  • 스레드가 하나 기다리거나 중단됩니다.
  • 스레드는 처리를 완료하기 위해 구성된 트랜잭션 시간 초과 시간보다 많은 것이 필요합니다.

다음 오류 메시지에 대한 로그를 확인하여 시간 초과 트랜잭션을 식별할 수 있습니다.

WARN ARJUNA012117 "TransactionReaper::check timeout for TX {0} in state {1}"

여기서 {0} 은(는) 트랜잭션의 Uid이고 {1} 은(는) 트랜잭션 관리자의 타임아웃 트랜잭션 트랜잭션의 {1} 상태 보기입니다.

Transaction Manager는 트랜잭션 시간 제한을 디버깅하기 위해 다음 옵션을 제공합니다.

  • 트랜잭션의 시간 제한 값을 구성하여 트랜잭션 수명을 제어할 수 있습니다. 트랜잭션 하위 시스템은 커밋 또는 롤백으로 인해 트랜잭션이 종료되기 전에 시간 초과 값이 경과하면 트랜잭션 하위 시스템에서 트랜잭션을 롤백합니다.
  • XAResource 인터페이스의 setTransactionTimeout 메서드를 사용하여 현재 트랜잭션을 리소스 관리자에게 전파할 수 있습니다. 지원되는 경우 이 작업은 리소스 관리자와 연결된 기본 타임아웃을 덮어씁니다. 시간 초과를 재정의하는 것은 다음과 같은 상황에서 유용합니다.

    • 장기 실행 트랜잭션이 기본값을 초과하는 수명이 있는 경우
    • 기본 시간 제한을 사용하면 트랜잭션이 종료되기 전에 리소스 관리자가 롤백되어 트랜잭션도 롤백될 수 있습니다.
  • 시간 제한 값을 지정하지 않거나 값 0 을 사용하는 경우 트랜잭션 관리자는 구현별 기본값을 사용합니다. JBoss EAP 트랜잭션 관리자에서 CoordinatorEnvironmentBean.defaultTimeout 속성은 이 구현별 기본값을 나타냅니다. 기본값은 300 초입니다. 값이 0 이면 기본 트랜잭션 시간 초과가 비활성화됩니다.

    다음 관리 CLI 명령을 사용하여 기본 트랜잭션 시간 초과를 수정할 수 있습니다.

    /subsystem=transactions:write-attribute(name=default-timeout,value=VALUE)

    관리형 도메인에서 실행하는 경우 /profile=PROFILE_NAME을 사용하여 명령 앞에 업데이트할 프로필을 지정해야 합니다.

  • JBoss EAP Transaction Manager는 XAResource 인스턴스에서 setTransactionTimeout 메서드를 호출하는 all-or-nothing 접근법을 지원합니다. JTAEnvironmentBean.xaTransactionTimeoutEnabled 속성을 true 로 설정하여 모든 인스턴스에서 메서드를 호출할 수 있습니다. 그렇지 않으면 com .arspringa.ats.jta.common.JTAEnvironmentBean 클래스를 사용하여 시간 제한을 비활성화하고 트랜잭션별로 지정할 수 있습니다.

5.2. 새 JBoss EAP 서버로 로그 마이그레이션

사전 요구 사항

트랜잭션 하위 시스템이 이전 JBoss EAP와 새 JBoss EAP 간에 동일하게 구성되었는지 확인합니다. 자카르타 트랜잭션 데이터 소스 목록을 포함하는 동일한 구성이 필요합니다. 복구해야 하는 로그가 데이터 소스에 연결되어야 하므로 동일한 구성이 필요합니다.

5.2.1. 파일 기반 로그 스토리지 마이그레이션

트랜잭션 관리자 로그를 새 JBoss EAP 서버로 마이그레이션하려면 새 JBoss EAP 서버에 로그를 복사할 수 있습니다.

다음 명령을 사용하여 파일 기반 로그를 복사할 수 있습니다.

  1. EAP_HOME 디렉터리로 이동합니다.
  2. 다음 명령을 사용하여 로그의 아카이브를 생성합니다.

    $ tar -cf logs.tar ./standalone/data/tx-object-store
  3. 다음 명령을 사용하여 아카이브된 로그를 새 EAP_HOME 디렉터리로 추출합니다.

    $ tar -xf logs.tar -C NEW_EAP_HOME

5.2.2. JDBC 저장소 기반 로그 스토리지 마이그레이션

5.3. JBoss EAP에서 XTS 활성화

트랜잭션 관리자의 XTS(XML Transaction Service) 구성 요소는 비즈니스 트랜잭션에서 개인 및 공용 웹 서비스의 조정을 지원합니다. XTS는 JBoss EAP 서버에서 호스팅되는 웹 서비스에 대한 WS-AT 및 WS-BA 지원을 제공합니다. 이는 standalone-xts.xml 구성을 사용하여 활성화할 수 있는 선택적 하위 시스템입니다.

XTS가 활성화된 JBoss EAP Server 시작

  1. JBoss EAP 서버 디렉터리로 변경합니다.

    cd $EAP_HOME
  2. 예제 XTS 구성 파일을 /configuration 디렉터리에 복사합니다.

    cp docs/examples/configs/standalone-xts.xml standalone/configuration
  3. xts 구성을 지정하여 JBoss EAP 서버를 시작합니다.

    Linux:

    bin/standalone.sh --server-config=standalone-xts.xml

    Windows:

    bin\standalone.bat --server-config=standalone-xts.xml

5.4. 만료된 트랜잭션 삭제

다음 속성을 사용하면 만료된 트랜잭션을 지울 수 있습니다.

ExpiryEntryMonitor

복구 관리자가 만료 스캐너 스레드를 초기화하면 Expiry EntryMonitor 오브젝트가 생성되어 오브젝트 저장소에서 데드 항목을 제거하는 데 사용됩니다. 여러 스캐너 모듈이 동적으로 로드되므로 특정 유형의 배달되지 않은 항목이 제거됩니다.

RecoveryEnvironmentBean.expiryScanners 시스템 속성을 사용하여 properties 파일에서 scanner 모듈을 구성할 수 있습니다. scanner 모듈은 초기화 시 로드됩니다.

$ EAP_HOME/bin/standalone.sh -DRecoveryEnvironmentBean.expiryScanners=CLASSNAME1,CLASSNAME2
expiryScanInterval

모든 scanner 모듈은 Expiry EntryMonitor 스레드에 의해 중단된 항목을 검사하기 위해 주기적으로 호출됩니다. 아래 예와 같이 expiryScanInterval 시스템 속성을 사용하여 시간 단위로 이 기간을 구성할 수 있습니다.

$ EAP_HOME/bin/standalone.sh -DRecoveryEnvironmentBean.expiryScanInterval=EXPIRY_SCAN_INTERVAL

모든 scanner 모듈은 Expiry Scanner 인터페이스에서 동일한 동작을 상속받습니다. 이 인터페이스는 다음을 포함하여 모든 scanner 모듈에서 구현한 검사 방법을 제공합니다. 스캐너 스레드는 이 검사 방법을 호출합니다.

ExpiredTransactionStatusManagerScanner

ExpiredTransactionStatusManagerScanner 는 오브젝트 저장소에서 배달된 TransactionStatusManagerItems 를 제거합니다. 이러한 항목은 삭제되기 전에 특정 기간 동안 오브젝트 저장소에 남아 있으며 기본적으로 12시간입니다. 아래 예와 같이 transactionStatusManagerExpiryTime 시스템 속성을 사용하여 이 기간(시간)을 구성할 수 있습니다.

$ EAP_HOME/bin/standalone.sh -DRecoveryEnvironmentBean.transactionStatusManagerExpiryTime=TRANSACTION_STATUS_MANAGER_EXPIRY_TIME
AtomicActionExpiryScanner

AtomicActionExpiryScanner 는 완료되었다고 가정하는 AtomicActions의 트랜잭션 로그를 이동합니다. 예를 들어 참가자가 커밋하도록 지시한 후에 오류가 발생하지만 트랜잭션 하위 시스템에서 로그를 업데이트할 수 있기 전에 JBoss EAP 트랜잭션 관리자가 커밋 요청을 재생성하려고 합니다. 이 재생은 분명히 실패하므로 로그가 제거되지 않습니다. AtomicActionExpiryScanner 는 손상된 등의 이유로 로그를 자동으로 복구할 수 없는 경우에도 사용됩니다. 모든 로그는 /Expired 로 추가된 이전 위치에 따라 특정 위치로 이동합니다.

참고

AtomicActionExpiryScanner 는 기본적으로 비활성화되어 있습니다. 트랜잭션 관리자 속성 파일에 추가하여 활성화할 수 있습니다. 손상된 로그를 처리할 수 있도록 활성화할 수 없습니다.

5.5. Heuristic Outcomes 복구

트랜잭션 리소스가 분산 트랜잭션을 완료하는 동안 트랜잭션 리소스가 일면 결정을 내릴 때 트랜잭션 업데이트를 커밋하거나 롤백할 때 복구가 수행됩니다. 분산된 데이터는 결정되지 않은 상태로 남을 수 있습니다. 네트워크 오류 또는 리소스 시간 초과는 복구가 완료될 수 있습니다. 추론적 완료로 인해 다음과 같은 복구 결과 예외 중 하나가 발생합니다.

HEURISTIC_COMMIT
이 예외는 트랜잭션 관리자가 롤백을 결정할 때 발생하지만 모든 리소스는 이미 자체적으로 커밋되었습니다. 이 경우 일관된 종료에 도달하기 때문에 아무 작업도 수행할 필요가 없습니다.
HEURISTIC_ROLLBACK
이 예외는 트랜잭션 관리자의 커밋 결정이 지연되었기 때문에 리소스가 모두 롤백을 수행했음을 나타냅니다. HEURISTIC_COMMIT 와 유사하게, 일관된 종료에 도달하기 때문에 이 경우에도 아무 작업도 수행하지 않아도 됩니다.
HEURISTIC_HAZARD
이 예외는 일부 업데이트의 배치를 알 수 없는 경우 발생합니다. 알려진 사람들에게는 모두 커밋되었거나 모두 롤백되어 있습니다.
HEURISTIC_MIXED
이 예외는 다른 트랜잭션이 커밋되는 동안 트랜잭션의 일부 부분을 롤백한 경우 발생합니다.

다음 절차에서는 Jakarta 트랜잭션을 사용하여 트랜잭션의 복구 결과를 처리하는 방법을 설명합니다.

  1. 트랜잭션 결과의 원인은 리소스 관리자가 커밋하거나 롤백할 수 있다고 약속한 다음 약속을 이행하지 못하기 때문입니다. 이는 타사 구성 요소, 타사 구성 요소와 JBoss EAP 간의 통합 계층 문제 또는 JBoss EAP 자체에 문제가 될 수 있습니다.

    지금까지 가장 일반적인 복구 오류의 원인은 환경에 일시적인 오류와 리소스 관리자를 처리하는 코딩 오류입니다.

  2. 일반적으로 환경에 일시적인 오류가 있는 경우 복구 오류를 확인하기 전에 이를 알 수 있습니다. 이는 네트워크 중단, 하드웨어 오류, 데이터베이스 장애, 정전 또는 기타 여러 가지 문제로 인해 발생할 수 있습니다.

    스트레스 테스트 중에 테스트 환경에서 복구 결과가 나오면 테스트 환경의 약점이 있음을 의미합니다.

    주의

    JBoss EAP는 장애 발생 시 복구되지 않은 상태인 트랜잭션을 자동으로 복구하지만 복구 트랜잭션은 복구하지 않습니다.

  3. 환경에 분명한 오류가 없거나 복구 결과를 쉽게 재현할 수 있는 경우 코딩 오류 때문일 수 있습니다. 솔루션을 사용하려면 타사 벤더에 문의해야 합니다.

    JBoss EAP의 트랜잭션 관리자에 문제가 있다고 생각되는 경우 지원 티켓을 작성해야 합니다.

  4. 관리 CLI를 사용하여 수동으로 트랜잭션 복구를 시도할 수 있습니다. 트랜잭션 복구에 대한 자세한 내용은 트랜잭션 참가자 복구 섹션을 참조하십시오.
  5. 트랜잭션 결과를 수동으로 확인하는 프로세스는 오류의 정확한 상황에 따라 달라집니다. 환경에 적용할 수 있는 다음 단계를 수행합니다.

    1. 관련된 리소스 관리자를 식별합니다.
    2. 트랜잭션 관리자 및 리소스 관리자의 상태를 검사합니다.
    3. 관련된 구성 요소 중 하나 이상에서 로그 정리 및 데이터 조정을 수동으로 강제 적용합니다.
  6. 테스트 환경에서 또는 데이터의 무결성에 관심이 없는 경우 트랜잭션 로그를 삭제하고 JBoss EAP를 다시 시작하면 복구 결과가 제거됩니다. 기본적으로 트랜잭션 로그는 독립 실행형 서버의 EAP_HOME/standalone/data/tx-object-store/ 디렉터리에 또는 관리형 도메인의 EAP_HOME/domain/servers/SERVER_NAME/data/tx-object-store/ 디렉터리에 있습니다. 관리형 도메인의 경우 SERVER_NAME 은 서버 그룹에 참여하는 개별 서버의 이름을 나타냅니다.

    참고

    트랜잭션 로그의 위치는 사용 중인 오브젝트 저장소와 object-store- relative-to 및 object-store- path 매개변수에 설정된 값에 따라 달라집니다. 파일 시스템 로그(예: 표준 섀도우 및 Apache ActiveMQ Artemis 로그)의 경우 기본 디렉터리 위치가 사용되지만 JDBC 오브젝트 저장소를 사용하는 경우 트랜잭션 로그가 데이터베이스에 저장됩니다.

5.5.1. Heuristic Outcomes의 의사 결정에 대한 지침

문제 감지

추론적 결정은 트랜잭션 시스템에서 발생할 수 있는 가장 중요한 오류 중 하나입니다. 다른 부분은 롤백되는 동안 트랜잭션의 일부를 가져올 수 있습니다. 따라서 트랜잭션의 원자성 속성을 위반할 수 있으며 데이터 무결성이 손상될 수 있습니다.

복구 가능한 리소스는 트랜잭션 관리자가 필요로 할 때까지 안정적인 스토리지로 복구 결정에 대한 모든 정보를 유지 관리합니다. 안정적인 스토리지에 저장된 실제 데이터는 복구 가능한 리소스 유형에 따라 다르며 표준화되지 않습니다. 데이터를 구문 분석하고 리소스를 편집하여 데이터 무결성 문제를 해결할 수 있습니다.

복구 결과는 서버 로그에 저장되며 리소스 관리자 및 트랜잭션 관리자를 사용하여 식별할 수 있습니다.

수동으로 트랜잭션 커밋 또는 롤백

일반적으로 트랜잭션을 수동으로 커밋하거나 롤백할 수 없습니다. JBoss EAP 트랜잭션 관리 관점에서 자동 복구를 위해 트랜잭션을 보류 중인 목록으로 다시 이동하여 레코드를 다시 시도하거나 삭제할 수 있습니다. 예를 들면 다음과 같습니다.

read-resource 작업을 사용하여 트랜잭션의 참가자 상태를 확인할 수 있습니다.

/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:read-resource

결과는 다음과 유사합니다.

{
   "outcome" => "success",
   "result" => {
       "eis-product-name" => "ArtemisMQ",
       "eis-product-version" => "2.0",
       "jndi-name" => "java:/JmsXA",
       "status" => "HEURISTIC_HAZARD",
       "type" => "/StateManager/AbstractRecord/XAResourceRecord"
   }
}

여기에 표시된 결과 상태는 HEURISTIC_HAZARD 상태이며 복구 대상입니다.

HEURISTIC_HAZARD 예외 복구

다음 단계에서는 위험 유형 추론 결과를 복구하는 방법에 대한 예를 보여줍니다.

  1. 복구를 시작하려면 각 리소스 관리자에게 문의하고 트랜잭션 관리자 툴에서 확인할 수 있는 다양한 분기의 결과를 설정해야 합니다. 그러나 리소스 관리자가 강제로 커밋하거나 롤백할 필요는 없습니다. 추론적 예외의 상태를 알고 있으려면 리소스 관리자를 검사해야 합니다.

    다음은 다양한 리소스 관리자의 추론적 결과를 나열하고 해결하는 참조 링크입니다.

    참고

    이러한 링크는 참조용으로만 사용되며 변경될 수 있습니다. 자세한 내용은 벤더 설명서를 참조하십시오.

  2. 다음 예와 같이 복구 작업을 실행해야 합니다.

    /subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recover

    복구 작업을 실행하면 트랜잭션의 상태가 PREPARE 로 변경되고 커밋 작업을 재생하여 복구 시도를 트리거합니다. 복구 시도에 성공하면 참가자가 트랜잭션 로그에서 제거됩니다.

    log-store 요소에서 probe 작업을 다시 실행하여 이를 확인할 수 있습니다. 참가자는 더 이상 나열되지 않아야 합니다. 마지막 참가자인 경우 트랜잭션도 삭제됩니다.

HEURISTIC_ROLLBACK 및 HEURISTIC_COMMIT 예외 복구

복구 결과가 롤백 유형인 경우 다음을 수행합니다.

  • 리소스 관리자가 잘 구현되어 있으면 리소스가 트랜잭션을 커밋할 수 없어야 합니다.
  • 나머지 트랜잭션을 정상적으로 커밋하고 트랜잭션 저장소에서 정리할 수 있도록 리소스 관리자에서 잊은 호출을 사용하여 분기를 삭제할지 여부를 결정해야 합니다.
  • 리소스 관리자에서 분기를 삭제하지 않으면 트랜잭션이 트랜잭션 저장소에 영구적으로 유지됩니다.

반면, 추론적 결과가 커밋 유형인 경우 비즈니스 의미 체계를 사용하여 일관되지 않은 결과를 처리해야 합니다.

수동 조정 실패 시 추가 작업

Oracle의 DBA_2PC_PENDING 테이블인 데이터베이스 트랜잭션 테이블을 확인할 수 있습니다. 그러나 이러한 항목은 특정 리소스 관리자에게 따라 다릅니다. Transaction Manager는 각 리소스 관리자에서 검사할 분기를 제공할 수 있습니다.

자세한 내용은 이 리소스 관리자에 대한 공급업체 설명서를 참조하십시오. 타사 리소스 관리자로 인해 문제가 발생한 것으로 의심되는 경우 공급업체와 함께 지원 티켓을 늘리는 것이 고려해야 합니다.





2024-02-08에 최종 업데이트된 문서

법적 공지

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.