문제

나는 매우 간단한 시나리오와 관련이 있습니다 데이터 베이스 그리고 a JMS 응용 프로그램 서버 (Glassfish)에서. 시나리오는 간단합니다.

1. an EJB inserts a row in the database and sends a message.
2. when the message is delivered with an MDB, the row is read and updated. 

문제는 때때로 삽입이 커지기 전에 메시지가 전달됩니다 데이터베이스에서. 2 단계 커밋 프로토콜을 고려하면 실제로 이해할 수 있습니다.

1. prepare JMS
2. prepare database
3. commit JMS
4. ( tiny little gap where message can be delivered before insert has been committed)
5. commit database

이 문제에 대해 논의했습니다 다른 사람들과, 그러나 대답은 항상 다음과 같습니다. "이상한, 그것은 상자 밖으로 작동해야한다".

내 질문은 다음과 같습니다.

  • 어떻게 상자 밖으로 작동 할 수 있습니까?
  • 내 시나리오는 상당히 간단하게 들립니다. 왜 비슷한 문제를 가진 사람들이 더 많지 않습니까?
  • 내가 뭔가 잘못하고 있습니까? 이 문제를 올바르게 해결할 수있는 방법이 있습니까?

문제에 대한 나의 이해에 대한 자세한 내용은 다음과 같습니다.

이 타이밍 문제는 참가자 가이 순서로 취급되는 경우에만 존재합니다. 2PC가 참가자를 역 순서 (데이터베이스 먼저 메시지 브로커)로 취급하면 괜찮습니다. 문제는 무작위로 일어나고 있었지만 완전히 재현 가능했습니다.

Glassfish 문서에서 JTA, JCA 및 JPA 사양의 분산 거래에서 참가자의 순서를 제어 할 방법을 찾지 못했습니다. 우리는 그들이 사용될 때의 순서에 따라 분산 거래에 입대 할 것이라고 가정 할 수 있지만 JPA와 같은 ORM을 사용하면 데이터가 플러시되는시기와 데이터베이스 연결이 실제로 사용되는시기를 알기가 어렵습니다. 아이디어가 있습니까?

도움이 되었습니까?

해결책

당신은 클래식 XA 2-PC 경주 조건을 경험하고 있습니다. 생산 환경에서 발생합니다.

내 마음에 오는 3 가지가 있습니다.

  1. JDBC가 XA가 아닌 자원 인 마지막 에이전트 최적화 (복구 시맨틱을 잃음)
  2. jms to to-deliver가 있습니다. (고의적으로 실시간을 잃는다)
  3. JDBC 코드로 다시 구축하십시오. (기능에 대한 최소한의 영향)

Weblogic 은이 LLR 최적화 가이 문제를 피하고 모든 XA 보증을 제공합니다.

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