문제

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 및 데이터베이스와 같은 단일 유형 또는 여러 유형의 리소스에 연결하든 전혀 중요하지 않습니다.

도움이되기를 바랍니다.

니틴

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top