Loading...
MySQL 9.5 Reference Manual 9.5의 15.3.8 XA Transactions의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
15.3.8.1 XA Transaction SQL Statements
15.3.8.2 XA Transaction States
15.3.8.3 Restrictions on XA Transactions
XA 트랜잭션에 대한 지원은 InnoDB 스토리지 엔진에서 사용할 수 있습니다. MySQL XA 구현은 X/Open CAE 문서 Distributed Transaction Processing: The XA Specification 에 기반합니다. 이 문서는 The Open Group에서 발행하며 다음 위치에서 볼 수 있습니다:
http://www.opengroup.org/public/pubs/catalog/c193.htm.
현재 XA 구현의 제한 사항은 Section 15.3.8.3, “Restrictions on XA Transactions”에 설명되어 있습니다.
클라이언트 측에는 특별한 요구 사항이 없습니다. MySQL 서버에 대한 XA 인터페이스는 XA 키워드로 시작하는 SQL 문으로 구성됩니다. MySQL 클라이언트 프로그램은 SQL 문을 전송하고 XA 문 인터페이스의 시맨틱을 이해할 수 있어야 합니다. 최신 클라이언트 라이브러리와 링크될 필요는 없습니다. 예전 클라이언트 라이브러리도 동작합니다.
MySQL 커넥터들 중 MySQL Connector/J 5.0.0 이상은 XA SQL 문 인터페이스를 처리하는 클래스 인터페이스를 통해 XA를 직접 지원합니다.
XA는 분산 트랜잭션을 지원합니다. 즉, 여러 개의 개별 트랜잭션 리소스가 글로벌 트랜잭션에 참여할 수 있는 기능을 제공합니다. 트랜잭션 리소스는 종종 RDBMS이지만, 다른 종류의 리소스일 수도 있습니다.
글로벌 트랜잭션은 그 자체로 트랜잭션적인 여러 동작을 포함하지만, 이들 모두가 하나의 그룹으로서 성공적으로 완료되거나, 하나의 그룹으로서 모두 롤백되어야 합니다. 본질적으로 이는 ACID 속성을 “한 단계 위”로 확장하여, 여러 ACID 트랜잭션을 글로벌 연산의 구성요소로서 동시에 실행할 수 있게 해주며, 이 글로벌 연산 또한 ACID 속성을 갖습니다.
(비분산 트랜잭션과 마찬가지로, SERIALIZABLE은 애플리케이션이 읽기 현상에 민감한 경우 선호될 수 있습니다. REPEATABLE READ는 분산 트랜잭션에 충분하지 않을 수 있습니다.)
분산 트랜잭션의 예는 다음과 같습니다:
어떤 애플리케이션은 메시징 서비스와 RDBMS를 결합하는 통합 도구로 동작할 수 있습니다. 이 애플리케이션은 메시지 전송, 조회 및 처리와 관련된 트랜잭션이 트랜잭션 데이터베이스를 함께 포함할 때, 이 모든 일이 하나의 글로벌 트랜잭션에서 일어나도록 보장합니다. 이를 “트랜잭션 이메일”로 생각할 수 있습니다.
어떤 애플리케이션은 MySQL 서버와 Oracle 서버 (또는 여러 MySQL 서버)와 같이 서로 다른 데이터베이스 서버를 포함하는 작업을 수행합니다. 여러 서버를 포함하는 작업은 각 서버에 로컬한 개별 트랜잭션이 아니라, 글로벌 트랜잭션의 일부로서 수행되어야 합니다.
은행은 계좌 정보를 RDBMS에 보관하고 자동 입출금기 (ATM)를 통해 돈을 송금하고 수령합니다. ATM 동작이 계좌에 올바르게 반영되도록 하는 것은 필수적이지만, 이것은 RDBMS만으로는 수행할 수 없습니다. 글로벌 트랜잭션 매니저는 ATM과 데이터베이스 리소스를 통합하여 금융 트랜잭션의 전체적인 일관성을 보장합니다.
글로벌 트랜잭션을 사용하는 애플리케이션은 하나 이상의 리소스 매니저와 트랜잭션 매니저를 포함합니다:
리소스 매니저(RM)는 트랜잭션 리소스에 대한 접근을 제공합니다. 데이터베이스 서버는 한 종류의 리소스 매니저입니다. RM이 관리하는 트랜잭션을 커밋하거나 롤백할 수 있어야 합니다.
트랜잭션 매니저(TM)는 글로벌 트랜잭션의 일부인 트랜잭션들을 조정합니다. TM은 각 트랜잭션을 처리하는 RM과 통신합니다. 글로벌 트랜잭션 내의 개별 트랜잭션은 글로벌 트랜잭션의 “브랜치”입니다. 글로벌 트랜잭션과 그 브랜치는 나중에 설명하는 네이밍 스킴으로 식별됩니다.
MySQL의 XA 구현은 MySQL 서버가 글로벌 트랜잭션 내에서 XA 트랜잭션을 처리하는 리소스 매니저로 동작할 수 있게 합니다. MySQL 서버에 연결하는 클라이언트 프로그램은 트랜잭션 매니저로 동작합니다.
글로벌 트랜잭션을 수행하려면, 어떤 구성요소가 관련되는지 알고 각 구성요소를 커밋 또는 롤백할 수 있는 지점까지 이끌어야 합니다. 각 구성요소가 성공 가능성에 대해 보고하는 내용에 따라, 이들 모두를 원자적 그룹으로 커밋하거나 롤백해야 합니다. 즉, 모든 구성요소가 커밋하거나, 모든 구성요소가 롤백해야 합니다. 글로벌 트랜잭션을 관리할 때는 어떤 구성요소나 연결 중인 네트워크가 실패할 수 있다는 점을 고려해야 합니다.
글로벌 트랜잭션을 실행하는 과정은 투페이즈 커밋(2PC)을 사용합니다. 이는 글로벌 트랜잭션의 브랜치들이 수행된 이후에 진행됩니다.
첫 번째 페이즈에서는 모든 브랜치를 prepare합니다. 즉, TM이 이들에게 커밋할 준비를 하라고 지시합니다. 일반적으로 이는 각 브랜치를 관리하는 RM이 그 브랜치에 대한 동작을 안정적인 저장소에 기록하는 것을 의미합니다. 각 브랜치는 이를 수행할 수 있는지 여부를 나타내며, 이 결과가 두 번째 페이즈에 사용됩니다.
두 번째 페이즈에서 TM은 RM들에게 커밋할지 롤백할지를 알려 줍니다. 모든 브랜치가 prepare되었을 때 커밋할 수 있다고 응답했다면, 모든 브랜치에 커밋하라고 지시됩니다. 어떤 브랜치든 prepare 시점에 커밋할 수 없다고 응답했다면, 모든 브랜치에 롤백하라고 지시됩니다.
일부 경우에는 글로벌 트랜잭션이 원페이즈 커밋(1PC)을 사용할 수 있습니다. 예를 들어, 트랜잭션 매니저가 어떤 글로벌 트랜잭션이 하나의 트랜잭션 리소스(즉, 단일 브랜치)만으로 구성된 것을 알게 되면, 그 리소스에 대해 prepare와 커밋을 동시에 수행하라고 지시할 수 있습니다.
15.3.7 SET TRANSACTION Statement
15.4 Replication Statements