2010-02-02 4 views
3

GAE에서 JDO를 사용하여 아래의 간단한 데이터베이스 트랜잭션 코드 블록을 사용하고 있습니다.java.sql.SQLexception에서 재 시도/복구하는 방법 : 동시 수정

throw 된 java.sql.SQLException에서 재 시도/복구하는 좋은 방법은 무엇입니까? Concurrent Modification?

개인 최종 공급자 pmp; ...

PersistenceManager pm = pmp.get(); { pm.currentTransaction(). begin();

MyObject myObject = pm.getObjectById (MyObject.class, id);

pm.currentTransaction(). commit();

{} 마지막

경우 (pm.currentTransaction()이 isActive().) { log.severe (this.getClass() getName() + "잡힌 DATABASE 예외.".); pm.currentTransaction(). rollback(); } }

답변

0

실제로 예외가 발생하는 곳은 어디입니까? commit() 및 isActive()의 의미에 대해 확실합니까? commit()은 새 트랜잭션을 자동으로 생성하여 트랜잭션을 항상 활성 상태로 유지합니다.

내 다른 추측은 이것이 동시에 액세스되는 싱글 톤 빈일 것이고, 그들은 모두 요청한 객체를 동시에 수정하는 다른 쿼리와 동일한 트랜잭션으로 끝난다는 것입니다.

+0

의미를 자세히 살펴 보도록 제안 해 주셔서 감사합니다. 스택 추적과 javadocs를 자세히 살펴보십시오. java.sql.exception가 commit()로부터 슬로우되어 java.sql.exception가 JDOCanRetryException의 서브 클래스 인 javax.jdo.JDODataStoreException 내에 중첩되어있는 경우 http://db.apache.org/jdo/api23/apidocs/ javax/jdo/JDODataStoreException.html 이제이 예외를 잡아 모든 변수를 단일 매개 변수 블록으로 내 보내지 않고 작업을 다시 시도 할 수 있습니까? – Stevko

+0

나는 아직도이 예외가 던져 질 수 없다고 느낀다. 직렬화 수준이 올바르게 설정되어 있습니까? currentTransaction(). isActive()까지 커밋을 시도 할 수 없습니까? – sibidiba

관련 문제