userTransaction에 액세스하면 2 단계 커밋 또는 XA를 사용한다는 의미입니까?
-
19-09-2019 - |
문제
UserTransaction UT = 조회 .... ut.begintransaction (); Savetofoodb (); stationelesejb.transactionsUpportedMethod (); // foo db savetofoodb ()에 무언가를 저장합니다. ut.commit ();
위의 일을하고 있다면 내 이해는 DB Plus JMS와 같은 여러 리소스에 걸쳐 있지 않기 때문에 XA 거래가 아니라는 것입니다. 내 이해가 맞습니까?
해결책
데이터 소스는 두 종류로 구성 할 수 있습니다.
- XA:이 데이터 소스는 배포 거래에 참여할 수 있습니다
- 현지의: 비 XA라고도 불리는 것은 분산 거래에 참여할 수 없습니다.
그만큼 UserTransaction
분산 거래에서 참가자를 조정하는 방법을 설명하는 JTA 사양에 정의됩니다.
그러나 JTA 사양을 구현하는 응용 프로그램 서버는 많은 최적화를 자유롭게 수행 할 수 있습니다. 그들 중 하나는 last-agent-optimization
, 분산 거래의 마지막 참가자가 현지의. 그런 다음 마지막 참가자를 위해 정기적으로 커밋됩니다. 참가자가 한 명 밖에 없다면 항상 그렇습니다.
요컨대 :
- 두 명 이상의 참가자가있는 경우 XA 및 2 단계 커밋을 사용해야합니다.
- 참가자가 하나만있는 경우 대부분의 응용 프로그램 서버는 로컬 데이터 소스를 지원하며 Full-Blow 2 Phase Commit 프로토콜을 사용하지 않습니다.
Glassfish의 경우 : 참조 :
편집하다
Glassfish의 단락 "거래 범위" 선적 서류 비치 나보다 더 잘 설명합니다. 모든 응용 프로그램 서버에서 동일하다고 생각합니다.
로컬 거래에는 하나의 비 XA 리소스 만 포함되며 모든 참여 응용 프로그램 구성 요소가 하나의 프로세스 내에서 실행해야합니다. 로컬 거래 최적화는 리소스 관리자와 관련이 있으며 Java EE 응용 프로그램에 투명합니다.
애플리케이션 서버에서 JDBC 리소스는 다음 기준 중 하나를 충족하는 경우 XA가 아닌 것입니다.
JDBC Connection Pool 구성에서 DataSource 클래스는 javax.sql.xadatasource 인터페이스를 구현하지 않습니다.
글로벌 트랜잭션 지원 상자가 확인되지 않았거나 자원 유형 설정이 존재하지 않거나 javax.sql.xadatasource로 설정되지 않습니다.
다음 조건이 사실 상태로 유지되면 거래는 로컬로 유지됩니다.
- 하나의 비 XA 리소스 만 사용됩니다. 추가 비 XA 리소스가 사용되면 거래가 중단됩니다.
- 거래 수입 또는 내보내기는 발생하지 않습니다.
여러 리소스 또는 여러 참가자 프로세스가 포함 된 거래는 배포되거나 글로벌 거래됩니다. 마지막 에이전트 최적화가 활성화 된 경우 글로벌 트랜잭션에는 하나의 비 XA 리소스가 포함될 수 있습니다. 그렇지 않으면 모든 자원은 XA 여야합니다. 사용 전용 에이전트 최적화 속성은 기본적으로 TRUE로 설정됩니다. 이 속성을 설정하는 방법에 대한 자세한 내용은 트랜잭션 서비스 구성을 참조하십시오.
트랜잭션에서 하나의 XA 리소스 만 사용되는 경우 1 단계 커밋이 발생하며, 그렇지 않으면 트랜잭션은 2 상 커밋 프로토콜과 조정됩니다.
다른 팁
userTransaction을 시작한 다음 XA 지원으로 선언 된 연결-팩토리를 사용하여 리소스 (예 : 데이터베이스)에 대한 연결을 얻으면 연결이 XA 트랜잭션의 일부가된다는 것을 의미합니다. 또한 JMS 및 데이터베이스와 같은 단일 유형 또는 여러 유형의 리소스에 연결하든 전혀 중요하지 않습니다.
도움이되기를 바랍니다.
니틴