2011-01-08 8 views
0

엔티티 관리자 em1이 있습니다 .em1은 db1 table1.Now에서 트랜스 코딩 tx를 시작합니다. 이제는 API getdata()를 호출합니다.이 API는 새로운 엔티티 관리자 em2를 creast하고 1 레코드를 반환합니다. 엔티티 관리자 em1은 em1에서 반환 한 레코드를 삭제하려고 시도합니다. 코드가 종료됩니다. em1에 의해 레코드가 잠겼습니다.이 문제를 해결할 수 있습니까? EM2의 기록이 EM1에 포함 된 테이블과 아무 상관이 있는지레코드 삭제시 문제가 발생했습니다.

create em1 
//em1 start transcation tx1 
tx1.start 
Object r = getData(); 
em1 tried to delete r //code hangs here 
tx1.commit 


Object getData(){ 
create em2 
return data found using em2 
} 
+0

이 OpenJPA 또는 최대 절전 모드입니까? – Rick

답변

0

em2를 만들지 마십시오. em1을 매개 변수로 getData() 메소드에 전달하십시오. 이렇게하면 em1 하나만 작동하게됩니다.

정확하게 모르겠지만 em1이 관련 테이블에 잠금을 설정하고있는 것으로 보이므로 외부에서 수행 할 수 없습니다.

0

그것은 귀하의 질문에서 명확하지 않다. 그렇다면 EM2가 닫히지 않았기 때문일 수 있습니다. "선택"이벤트조차도 트랜잭션을 포함합니다. 따라서 EM2에 명시적인 트랜잭션 경계를 추가하는 것이 가장 먼저해야 할 말입니다. 암시 적 트랜잭션은 실제로 좋은 것은 아니며 사용중인 데이터베이스 및 격리 수준에 따라 기본 데이터베이스가 EM2의 암시 적 트랜잭션이 완료 될 때까지 기다리는 중일 수 있으므로 코드에 dead lock이 발생합니다.

나의 제안 : 좋은 방법으로

Object getData(){ 
    create em2 
    tx2.start 
    get record 
    tx2.commit 
    close em2 
    return record 
} 

, 항상 명시 적으로도 목적을 읽기 위해, 시작하고 트랜잭션을 커밋하려고합니다. 트랜잭션을 지정하지 않더라도 데이터베이스 이 암시 적으로 시작됩니다.

관련 문제