2014-02-25 1 views
1

일관되게 문제를 재현하는 간단한 JDO 테스트 사례가 있습니다. 1. 두 개의 앱 엔진 작업이 거의 동시에 같은 엔티티를 수정합니다. 2. 작업 3. 엔티티에 속성 A를 작업 A를 수정 가지고 JDO 트랜잭션을 사용하고 개체를로드 할 수는 getObjectById를 사용 4.여러 서버 인스턴스가있는 AppEngine JDO가 키로 가져온 엔티티에서 트랜잭션 업데이트를 잃습니다.

문제가 발생 엔티티에 속성 B를 작업 B를 수정 한 (가정 A는 먼저 실행) 두 작업 각각은 두 개의 서로 다른 응용 프로그램 엔진 인스턴스에서 실행됩니다. 어떤 경우에는 작업 A가 특성 A를 Null이 아닌 값으로 올바르게 설정하고 트랜잭션을 성공적으로 커밋했다는 로그 메시지를 볼 수 있습니다. 그런 다음 태스크 B가 별도의 인스턴스에서 실행될 때 태스크 A가 속성 A에 수행 한 변경 사항을 볼 수 없다는 것을 인쇄합니다. 그런 다음 태스크 B는 속성 B를 널 (null)이 아닌 값으로 설정했으며 트랜잭션이 완료되었음을 기록합니다 성공적으로

그런 다음 데이터 스토어를 살펴보면 Null이 아니며 트랜잭션이 성공했다는 로그 출력을 볼 수 있지만 속성 A도 여전히 null입니다. 나는 두 가지 중 하나를 기대했을 것이다. 1) 태스크 B가 엔티티를로드 할 때, 속성 A의 값이 널이 아닌 값으로 설정되었거나 2) 태스크 B가 부실 데이터를로드했지만, "너무 많은 경합"오류. 그 중 하나는 괜찮을 것입니다. (때로는 경합 오류가 있음을주의하십시오.)

무엇이 누락 되었습니까? 각 인스턴스에 이상한 캐싱이있는 것 같습니다. 나는 엔티티를 트랜잭션 내에서 키로로드하는 것이 별도의 앱 엔진 인스턴스에서 이루어진 경우에도 그 엔티티에 대한 변경 사항을 반영해야한다는 것을 확신했다. 테스트 케이스를 작성하여이를 재현 할 때 완전히 새로운 엔티티 클래스와 타스크를 작성하여 다른 코드가 어떻게 든 작동하지 않도록하고 프로덕션에서 재현했습니다 (devserver는 약간 다른 동작을 제공함).

도움을 주시면 대단히 감사하겠습니다.

답변

1

버전 문제가있는 것 같습니다. @version을 사용하면 동시 변경을 자동으로 처리하므로 낙관적 인 잠금 예외가 발생합니다.

+0

나는 당신이 옳다고 생각합니다. 저는 App Engine의 데이터 저장소가 트랜잭션 내에서 키에 의해 객체를 가져올 때 엔티티에 대한 가장 최근 값을로드하는 것에 대한 보장을했다는 잘못된 지침에 따라 작업하고있었습니다. 나는 그들이 저수준 API를 사용하고 있거나 Objectify를 사용하고 있다면 여전히 그럴 것이라고 생각한다. 이것이 JDO 사용의 증상 인 합병증 일 수 있습니까? – stephenp

+0

Google의 JDO 용 플러그인 (단순히 인터페이스 등)은 데이터 저장소로 보내지는 것을 기록하므로 하위 수준의 API에서 호출되는 것을 쉽게 확인할 수 있습니다 (모든 지속성 라이브러리에서 호출하는 것) 해당 데이터 저장소). – DataNucleus

관련 문제