Closed JasonYoo1995 closed 2 years ago
책 9.1 ~ 9.2에 의하면, 자바에서 글로벌 트랜잭션을 관리하기 위해 JtaTransactionManager
를 사용합니다.
JTA 트랜잭션 매니저가 각 분산 자원을 관리하는 리소스 매니저
와 XA 프로토콜을 기반으로 통신하여 각 리소스에 대한 트랜잭션을 적용합니다.
아래의 그림 또는 책의 그림 9-1에서 개략적인 흐름 파악이 가능합니다 😃
위의 그림에서는 문제점이 있는데, 사용하는 리소스의 벤더마다 제각각의 리소스 매니저를 구현해야 한다는 점입니다.
전형적으로 기술과의 결합도가 높아지는 양상이기 때문에, 스프링은 아래와 같이 PlatformTransactionManager
를 이용해 트랜잭션을 추상화합니다.
책에 있는 표현으로는 Coordinator(Transaction Manager, TM), Cohorts(Resource Manager, RM)로 이해하면 좋을 것 같습니다.
1. TM은 ‘트랜잭션 시작’ 이라는 내용을 로그파일에 작성하고, RM에게 트랜잭션에 대한 요청을 보낸다.
2. RM들은 참여하고 있는 디비는 자신의 로그에 트랜잭션을 기재하고 다른 사용자가 접근 못하게 락을 설정하고 작업을 수행한 뒤 커밋할 준비가 되었다고 TM에게 응답한다.
3. TM은 커밋할 준비가 되었다는 메세지를 받고 ‘트랜잭선 종료’를 로그에 기록한 뒤, RM들에게 커밋 하라고 통보한다.
4. RM들은 이 사실을 트랜잭션 로그에 기록한뒤 커밋을 하고 락을 푼다.
5. 만약 커밋하기전에 참여 RM중 문제가 발생하면 TM은 롤백하라고 RM들에게 통보한다.
Query to Commit
트랜잭션 응답을 기다립니다.Vote
메세지를 전송한다.Commit
메세지를 전송하고 Resource Lock을 해제한다.
만약 실패했다면 Coordinator는 Node에게 Rollback
메세지를 전송하여 원래 상태로 복구한 뒤 Resource Lock을 해제한다.MysqlXADataSource
) 를 사용하고, 그러한 인터페이스들의 실제 구현체에서 동작하는 통신 과정의 트랜잭션은 JTA Transaction Manager 에서 관리 되는 것 같음.PlatformTransactionManager
에서는 다음의 두 가지 인터페이스를 사용한다TransactionDefinition
: 트랜잭션의 프로퍼티를 관리한다
TransactionStatus
: 트랜잭션의 실행 제어를 관리한다
PlatformTransactionManager.getTransaction()
을 통해 반환되는 값https://suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/
이 블로그보다 잘 설명할 자신이 없습니다 😅
READ UNCOMMITTED
, READ COMMITTED
, REPEATABLE READ
, SERIALIZABLE
이다.
주제
9장 트랜잭션 관리를 읽고 중요✨ 하다고 생각하는 키워드와 선택한 이유에 대해서 코멘트로 달아주세요.
연관챕터
66