Open gmelon opened 4 months ago
일반적인, 단일 DB 커넥션 안에서 만들어지는 트랜잭션을 로컬 트랜잭션이라 한다
하나의 트랜잭션에서 여러 개의 DB에 접근해 데이터를 추가해야 한다면? 또, 메시지 큐에 메시지를 추가하는 작업과 DB에 데이터를 추가하는 작업을 하나의 트랜잭션으로 묶고 싶다면?
이때 사용할 수 있는 것이 글로벌 트랜잭션이다.
자바에서는 로컬 트랜잭션 만을 제공하는 JDBC API외에 JTA (Java Transaction API) 라는 API를 통해 글로벌 트랜잭션의 제어 기능을 제공한다.
여러 종류의 데이터 접근 기술과 JTA를 함께 사용하기 위해서는 각 데이터는 JDBC, JMS 등 각자의 API를 사용하고 트랜잭션의 제어만 직접 하지 않고 JTA로 위임하면 된다. JTA는 각 데이터 접근 API들과 XA 프로토콜 이라는 것을 통해 통신한다.
Spring에서는 PlatformTransactionManager
라는 것을 통해 글로벌 트랜잭션을 제공한다. JDBC를 사용하는 경우 DataSourceTransactionManager
, JPA는 JpaTransactionManager
등 데이터 접근 기술 별 여러 구현체가 준비되어 있다.
2PC를 통한 분산 트랜잭션 처리를 위해 X-Open에서 명시한 표준
각 데이터 리소스에 prepare
, commit
단계를 통해 DB 반영 가능 여부와 반영 여부를 물어보고 모든 참여자들간의 합의가 되었을 때만 모든 변경 사항을 커밋하도록 하는 알고리즘이다. 모든 참여자들이 커밋되기 전까지 모든 리소스가 락
이 걸린다.
MSA 환경에서 적용하기 어렵다는 단점과 오랜 락으로 인한 성능 문제로 인해 실제로는 글로벌 트랜잭션보다는 이벤트 큐 등으로 대체해서 사용한다고 한다.
글로벌 트랜잭션
의 정의와,DBMS 별 간단한 구현 방식
,로컬 트랜잭션과의 차이점
정리해서 올리겠습니다..!