2

필자는 MDB, 스프링 통합 및 지속성을위한 JPA를 기반으로하는 이벤트 기반 응용 프로그램을 보유하고 있습니다. 응용 프로그램은 max-pool-size 기본값 (16)을 사용하여 weblogic 10.3에 배포됩니다.MDB의 레이스 조건 : 가장 좋은 방법은 무엇입니까?

내 응용 프로그램은 DB를 수정하는 일부 메시지를 처리해야합니다. 도메인 객체가 존재하지 않거나 존재하는 경우 업데이트 할 필요가있는 로직에 대해 도메인 객체를 삽입해야한다는 일부 메시지를 처리해야하는 경우를 상상해보십시오.

개체가 존재하는지 여부를 DB 확인을 수정하고 JPA에서 병합을 호출하는 구성 요소. DAO에서 병합을 호출 할 때 두 개의 동시 메시지가 병렬로 실행되기 때문에 JPA는 개체가 아직 보존되지 않았기 때문에 JPA에서 두 개의 INSERT 문을 트리거하므로 그 중 하나만 올바르게 실행됩니다.

이벤트 구동 응용 프로그램에서 이러한 종류의 "경쟁 조건"을 처리 할 패턴이 있습니까?

종류 마시모 가장 간단한 해결책은 업데이트를 수행해야하는 다시 merge 전화, 제 삽입에 의해 발생 된 예외를 캐치하는

답변

1

를 간주한다.

또는, 첫번째가 완료 될 때까지 merge 차단되도록한다 mergeSERIALIZABLE에서 트랜잭션 격리를 수행 couldtry하고, 두번째는 업데이트를 수행한다.

이 전체 시나리오의 주된 문제점은 여러 동시 이벤트가 발생하여 주어진 엔티티를 수정해야하는 경우 올바른 순서로 실행 중인지 확인하는 것입니다. 분명히 당신은 이것을 동시에 처리하기보다는 순차적으로 처리해야합니까? 동시 이벤트 소비자를 사용하는 경우 순서는 비 결정적입니다.

+0

좋습니다. 직렬화 가능 레벨이 직렬화 가능한 노드인지 또는 클러스터인지 여부를 알고 있습니까? 두 노드가있는 클러스터에 응용 프로그램을 배포해야합니다. 친절합니다. Massimo –

+0

@MassimoUgues : 트랜잭션 관리자에 따라 다르지만 일반적으로 데이터베이스 수준의 격리이므로 클러스터에 안전해야합니다. – skaffman

+0

JTA 스프링을 사용하기 때문에 클러스터에 안전해야합니다. 나는 격리 = SERIALIZABLE에 대해 큰 병목이 될 것이라고 생각하고있었습니다. 동일한 ID로 식별되는 일부 도메인 객체에 영향을 미치는 메시지에 대해서만 이러한 종류의 동시성을 처리해야하므로 일종의 db 기반 모니터 (예 : 해당 ID의 업데이트를 위해 일종의 선택)를 생각하고있었습니다. 당신이 그것에 대해 어떻게 생각하십니까? –