아래의 쿼리로 현재 실행중인 XA 트랜잭션을 식별할 수 있습니다. (아래는 임의로 생성한 xid입니다)
mysql> XA RECOVER
-- MySQL 5.7.5부터는 16진수 xid 값을 확인할 수 있습니다.
mysql> XA RECOVER CONVERT XID
|formatID |gtrid_length |bqual_length |data |
|---------|--------------|--------------|--------------------------------------------------------------------|
|2 |30 |2 |0x31373632336663642D366138322D343061652D383337362D663366666231313036|
xid 값은 클라이언트에 의해 제공되거나 MySQL 서버에 의해 생성되며 1~3 개의 부분으로 구성됩니다.
xid : gtrid [, bqual [, formatID]]
XA 트랜잭션을 Rollback 또는 Commit 하기 위해 xid를 16 진수로 출력합니다.
XA RECOVER CONVERT XID
0x31373632336663642D366138322D343061652D383337362D663366666231313036
이때 xid에서 gtrid, bqual 부분을 추출해야 합니다. 아래의 형태로 xid를 전달할 경우 Unknown XID 오류가 발생하게 됩니다.
XA ROLLBACK 0x31373632336663642D366138322D343061652D383337362D663366666231313036
현재 변숫값은 아래와 같습니다.
formatID : 2
gtrid_length : 30
bqual_length : 3
위의 xid는 16진수 이므로 처음 60자리가 gtrid 값이 되고 이후 6자리가 bqual 값이 됩니다. 데이터 필드를 추출한 후에는 아래와 같이 Rollback 또는 Commit을 진행합니다.
XA ROLLBACK [gtrid], [bqual], [formatID]
XA ROLLBACK X'31373632336663642D366138322D343061652D383337362D663366666231', X'313036', 2
이후 활성 트랜잭션이 종료되고 쿼리가 정상적으로 수행되는 것을 확인할 수 있습니다.
왜 이런 상황이 발생했을까..??
XA 트랜잭션 처리 중 발생한 충돌은 MySQL 내부에서 자동으로 복구가 되지만 극히 드문 경우에 충돌된 트랜잭션이 남아있는 경우가 발생(일종의 버그…)한다고 합니다재부팅 시에도 트랜잭션은 유지되고 별도의 조지가 없을 경우 해당 트랜잭션은 영원히 유지된 채 존재하기 때문에 반드시 Commit 또는 Rollback이 진행되어야 합니다.
여담으로 Percona mysql 개발자가 말하기를 8년 동안 2번의 사례가 있었다고 합니다. 빠른 장애 해결을 위해 XA 트랜잭션을 사용하는 애플리케이션의 경우 잔존하는 XA 트랜잭션에 대한 에러 핸들링 방법을 알아놓는 것도 좋다고 생각됩니다.