2012-12-03 6 views
3

JPEE를 사용하여 JavaEE에서 'SELECT FOR UPDATE NOWAIT'을 ​​사용하려고합니다. 이다 나는 그것을 할 방법 :JavaEE : 'FOR UP UP UP NOWAIT'을 ​​선택하면 실패 할 때 롤백을위한 JTA 트랜잭션을 표시하지 않습니까?

props.put("javax.persistence.lock.timeout", 0); 
em.find(MyEntity.class, id, LockModeType.PESSIMISTIC_READ, props); 

이 잘 한 가지를 제외하고 간다 :이 (잠금을 획득하지 못했다) 실패하면 다음 PessimisticLockException 대신 다른 경우에 발생합니다 LockTimeoutException 예 (의 발생합니다 포지티브 타임 아웃이 설정 됨), 트랜잭션 (JTA 트랜잭션)이 롤백으로 표시됩니다.

네이티브 쿼리를 대신 사용해 보았지만 동일한 결과가 나타납니다.
EclipseLink에서 Weblogic 12.1을 사용하고 있습니다 (차이점이없는 TopLink도 시도했습니다).

실행이 실패 할 때 JavaEE에서 JTA 트랜잭션을 롤백으로 표시하지 않고 'SELECT FOR UPDATE NOWAIT'를 실행할 수있는 방법이 있습니까?

답변

2

버그를 기록하고 투표하십시오.

OraclePlatform의 고유 한 서브 클래스를 작성하고 isLockTimeoutException()을 대체하여 수정할 수 있습니다.

또한 롤백을 피하기 위해 쿼리를 DatabaseQuery로 실행할 수도 있습니다.

em.unwrap(Session.class).executeQuery(((JpaQuery)query).getDatabaseQuery()) 
+0

어디에서 버그를 기록해야합니까? EclipseLink에서? TopLink? 그리고 이것은 정말로 버그입니까? 사양이 이것에 관해 무엇을 말해야합니까 (나는 아무것도 추측하지 않습니다)? – wafwaf

+0

예, 실제 버그입니다. EclipseLink http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching. TopLink를 사용하고 있고 지원이 있다면 Oracle 지원 팀에 문의하십시오. 잠금 픽스 이외에, EclipseLink는 롤백을 강제하는 오류를 피하기 위해 쿼리 힌트 또는 설정을 제공해야한다고 생각합니다. – James

+0

버그를 기록했습니다 : https://bugs.eclipse.org/bugs/show_bug.cgi?id=396266 – wafwaf