2011-08-23 5 views
2

우리는 우리의 응용 프로그램에서 여러 다른 모델을 위해 메모리 내 LRU 캐시를 사용합니다. 부실 항목과 같이 롤백되는 트랜잭션에서 발생하는 문제를 피하기 위해 트랜잭션 캐시 개념이 추가되었습니다. 각 트랜잭션에 대해 임시 캐시가 만들어지고 항목이 롤백되거나 주 항목으로 복사되는 경우 삭제됩니다 해당 모델이 커밋되면 캐시합니다.Transaction.delistResource()를 언제 호출해야합니까?

캐시를 구현하려면 XAResource을 구현하고 commit()rollback() 메서드를 무시합니다. 새로운 Transaction이 메인 캐시에없는 일부 데이터에 액세스하려고 할 때마다 트랜잭션 캐시가 생성되어 enlistResource()으로 전달됩니다.

문제는 내가 트랜잭션이 이미 롤백 표시된 말, IllegalStateException을 던지는 된 commit()rollback() 방법, 내 캐시 인스턴스에 delistResource()를 호출하려고 (또는 위탁) 한 것입니다. 그래서 궁금 해서요 ... 이 아니라면은 자원으로 캐시를 제거합니다 (다시 말하면 롤백 또는 커밋 프로세스의 일부로 이미 삭제됩니다). 그렇지 않으면 흐름의 다른 지점이 있어야합니다. 불리다?

답변

1

delistResource를 호출하는 것은 XAResource의 메소드가 아니며, 앱 서버의 Transaction 구현입니다. 리소스를 상장하고 트랜잭션을 가져와 delist를 호출하면 필요에 따라 리소스의 end()를 호출합니다. 트랜잭션 관리자는 마찬가지로 종료 처리의 일부로 end()를 암시 적으로 호출하므로 커밋 또는 롤백시 수동으로 호출하지 않습니다. 분리 목록을 처리해야하는 유일한 경우는 다중 트랜잭션 컨텍스트에서 동일한 자원 인스턴스를 사용할 때입니다. 캐시 구현에 따라 예를

 

    Cache c = getCache(); 
    c.makeUpdate(); // no transaction running, should auto commit. 
    tx.begin(); // start tx A 
    c.makeUpdate(); // transactional within A 
    tx.suspend(); 
    tx.begin(); // start tx B 
    c.makeUpdate(); // transactional within B 
    tx.commit(); //end B 
    tx.resume(A); 
    tx.commit(); // end A 

위해 당신은 커밋 또는 롤백에 대해 상장 폐지 중단하고 이력서에 다시 입대,하지만해야 할 수 있습니다. 또는 자원 인스턴스가 보유한 유효 tx 컨텍스트를 갱신하기 위해 enlist/delist 호출 순서에 의존하는 대신 각 makeUpdate() 호출에서 트랜잭션 컨텍스트를 확인하십시오.

이 절차는 절차 적 XA 사양과 개체 지향 JTA 사양 간의 매핑이 잘못되어 어렵습니다. 솔직히 전문가에게 맡기는 것이 좋습니다. 예를 들어, JBoss Infinispan은 모든 것을 처리하고 다른 많은 기능을 제공하는 오픈 소스 트랜잭션 캐시를 제공합니다.

관련 문제