11.2.10. XA 복구 프로세스의 제한 사항

XA 복구에는 다음과 같은 제한 사항이 있습니다.

  • 성공적으로 커밋된 트랜잭션에서 트랜잭션 로그를 지우지 못할 수 있습니다.

    XAResource 커밋 메서드가 성공적으로 완료되고 트랜잭션을 커밋한 후 JBoss EAP 서버가 충돌하지만 코디네이터가 로그를 업데이트하기 전에 서버를 다시 시작할 때 로그에 다음 경고 메시지가 표시될 수 있습니다.

    ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecord

    이는 복구 시 JBoss Transaction Manager(TM)가 로그에서 트랜잭션 참가자를 확인하고 커밋을 다시 시도하기 때문입니다. 결국 JBoss는 리소스가 커밋되어 더 이상 커밋을 다시 시도하지 않는다고 가정합니다. 이 경우 트랜잭션이 커밋되고 데이터가 손실되지 않으므로 이 경고를 무시해도 됩니다.

    경고를 방지하려면 com.arspringa.ats.jta.xaAssume rescueyComplete 속성 값을 true로 설정합니다 . 이 속성은 새 XAResource 인스턴스가 등록된 XAResource recoveryy 인스턴스에서 찾을 수 없을 때마다 확인됩니다. true 로 설정하면 복구에서 이전 커밋 시도가 성공했다고 가정하고, 추가 복구 시도 없이 인스턴스가 로그에서 제거할 수 있다고 가정합니다. 이 속성은 전역적이며 잘못 사용되는 경우 커밋되지 않은 상태로 유지될 수 있으므로 주의해서 사용해야 합니다.

    참고

    JBoss EAP 7.4는 성공적으로 커밋된 트랜잭션 이후에 트랜잭션 로그를 지우기 위해 구현되었으며 위의 상황이 자주 발생하지 않아야 합니다.

  • XAResource.prepare() 끝에 서버가 충돌할 때 롤백은 JTS 트랜잭션에 대해 호출되지 않습니다.

    XAResource.prepare() 메서드 호출이 완료되면 JBoss EAP 서버가 충돌하는 경우 모든 참여 XAResource 인스턴스가 준비됨 상태로 잠겨 있으며 서버를 다시 시작할 때 이러한 방식으로 유지됩니다. 트랜잭션은 롤백되지 않으며 트랜잭션 시간이 초과되거나 데이터베이스 관리자가 수동으로 리소스를 롤백하고 트랜잭션 로그를 지울 때까지 리소스가 잠겨 있습니다. 자세한 내용은 https://issues.jboss.org/browse/JBTM-2124의 내용을 참조하십시오.

  • 커밋된 트랜잭션에 주기적인 복구가 발생할 수 있습니다.

    서버가 과도하게 로드되면 서버 로그에 다음 경고 메시지와 stacktrace가 포함될 수 있습니다.

    ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_NOTA: javax.transaction.xa.XAException

    부하가 많으면 트랜잭션에서 수행한 처리 시간이 주기적인 복구 프로세스 활동 시간과 겹칠 수 있습니다. 주기적인 복구 프로세스는 여전히 트랜잭션이 진행 중인 것을 감지하고 롤백을 시작하려고 시도하지만 실제로 트랜잭션이 계속 완료됩니다. 현재 주기적인 복구 시도는 시도하지만 롤백에 실패하여 서버 로그에 롤백 실패를 기록합니다. 이 문제의 근본적인 원인은 향후 릴리스에서 해결될 예정이지만 당분간 해결방법을 사용할 수 있습니다.

    com.arspringa.ats.jta.orphanSafetyInterval 속성을 기본값 10000 밀리초보다 높은 값으로 설정하여 복구 프로세스의 두 단계 간 간격을 늘립니다. 40000 밀리초 값을 사용하는 것이 좋습니다. 이 경우 이 문제가 해결되지 않습니다. 대신 발생할 가능성을 줄이고 경고 메시지가 로그에 표시됩니다. 자세한 내용은 https://developer.jboss.org/thread/266729의 내용을 참조하십시오.