2010-11-23 7 views
4


다음 코드에서 ut 인스턴스의 재사용이 올바 릅니까?commit() 후에 UserTransaction 인스턴스를 재사용 할 수 있습니까?

UserTransaction ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); 
ut.begin(); 
doSomeWork(); 
ut.commit();//Or rollback (I think it doesn't matter) 
ut.begin(); //Or rollback (I think it doesn't matter) 
doOtherWork(); 
ut.commit(); 

은 JNDI 자원은 이렇게 정의 된 경우 :

Reference atomikosUserTransactionFactoryDS = new Reference("com.atomikos.icatch.jta.UserTransactionImp", 
       "com.atomikos.icatch.jta.UserTransactionFactory", null); 
atomikosUserTransactionFactoryDS.add(new RefAddr("name") { 
public Object getContent() { 
     return "UserTransaction"; 
}}); 
atomikosUserTransactionFactoryDS.add(new RefAddr("type") { 
    public Object getContent() { 
    return "com.atomikos.icatch.jta.UserTransactionImp"; 
}}); 
initContext.rebind("java:comp/UserTransaction", atomikosUserTransactionFactoryDS); 

내가 내가 다른 조회를 추가해야합니다, 그래서 공장에서 새 UserTransaction을 검색할지 여부를하기 전에 약 확실하지 않다 새로운 UserTransaction을 시작 하시겠습니까?

저는 관련이 있다고 생각하지 않지만 자원 정의 상태로 저는 Atomikos를 트랜잭션 관리자로 사용하고 있습니다. (공장도 마찬가지입니다).

감사합니다,
잇대

+0

조치는 한 가지만하고 한 가지만 수행해야합니다. 한 통화 내에서 여러 거래를 호출하는 것과 같이 여러 가지 일을하는 이유는 무엇입니까? –

+0

실제 시나리오는 약간 다릅니다. 스레드 내부에서 파일을 기다리는 while (true) 루프와 ut.begin, ut.commit을 사용하는 루프가있는 경우가 많습니다. 각 반복의 끝에서 스레드가 잠자기 상태가되기 전에 잠자기 전에 트랜잭션을 커밋하고 파일이있을 경우 깨우면 새로운 논리 트랜잭션이 생깁니다. 물론 일단 파일이 발견되면 코드를 리팩토링하여 ut을 잡고 논리와 커밋을 수행하는 다른 방법으로 리팩터링 할 수 있지만 현재 디자인은 내 것이 아니며 단지 이것이 올바르지 않은지 확인하고자했습니다. 그래도 의견을 보내 주셔서 감사합니다. – Ittai

답변

3

재사용 괜찮습니다.

UserTransaction은 특정 트랜잭션 인스턴스를 나타내지 않고 현재 스레드의 트랜잭션 컨텍스트를 관리하는 방법을 제공합니다. 원한다면 싱글 톤으로 생각하십시오. UserTransaction은 일반적으로 stateless입니다.

트랜잭션의 개별 인스턴스는 별개의 엔티티이며 일반적으로 사용자 코드에 의해 직접 필요하지 않습니다. 하나는 각 tx마다 만들어지며 재사용 할 수 없습니다.

동면자 인 경우 SessionFactory와 Session의 관점에서 생각해보십시오.