2011-09-21 5 views
3

Spring이 우리의 트랜잭션을 관리 할 수 ​​있도록 Spring의 PlatformTransactionManager을 사용하기 위해 기존 트랜잭션 API를 개조하고자합니다. 다음과 같이 내 DataSource들 체인 :Spring의 PlatformTransactionManager는 트랜잭션을 특정 순서로 커밋해야합니까?

DataSourceTransactionManager ->LazyConnectionDataSourceProxy ->dbcp.PoolingDataSource ->OracleDataSourceDataSourceTransactionManager 실험에서

, 내가 PROPAGATION_REQUIRES_NEW가 사용되는 경우,이 Spring의 트랜잭션 관리가 필요하다고 보인다 발견을 트랜잭션은 LIFO 형식으로 커밋/롤백됩니다. 즉, 가장 최근에 생성 된 트랜잭션을 먼저 커밋/롤백해야합니다.

예 :

@Test 
public void testSpringTxns() { 

    // start a new txn 
    TransactionStatus txnAStatus = dataSourceTxnManager.getTransaction(propagationRequiresNewDefinition); // specifies PROPAGATION_REQUIRES_NEW 
    Connection connectionA = DataSourceUtils.getConnection(dataSourceTxnManager.getDataSource());  

    // start another new txn 
    TransactionStatus txnBStatus = dataSourceTxnManager.getTransaction(propagationRequiresNewDefinition); 
    Connection connectionB = DataSourceUtils.getConnection(dataSourceTxnManager.getDataSource()); 

    assertNotSame(connectionA, connectionB); 
    try { 

     //... do stuff using connectionA 
     //... do other stuff using connectionB 
    } finally { 
     dataSourceTxnManager.commit(txnAStatus); 
     dataSourceTxnManager.commit(txnBStatus); // results in java.lang.IllegalStateException: Cannot deactivate transaction synchronization - not active 
    } 
} 

슬프게도, 이것은 당신이 자바 객체로 표현 거래를 만들 수 있습니다 우리의 현재의 트랜잭션 (transaction) API와에 잘 맞는, 그리고 어떤 순서로 커밋하지 않습니다.

내 질문 : 이 LIFO 동작이 Spring의 트랜잭션 관리 (완전히 별개의 트랜잭션조차도)의 기본이라고 생각합니까? 아니면 위의 테스트가 통과 할 수 있도록 동작을 조정할 수있는 방법이 있습니까?

나는 주석, AOP 등을 사용하는 것이 적절한 방법을 알고 있지만 현재 우리의 코드는 Spring에서 관리하지 않으므로 실제로는 옵션이 아닙니다.

감사합니다.

+0

'PROPAGATION_REQUIRES_NEW'는 트랜잭션을 전혀 커밋/롤백 할 필요가 없어야하며 기존 트랜잭션을 일시 중단하고 새 트랜잭션을 시작해야합니다. – skaffman

답변

1

예, 동일한 문제가 발생했습니다. in my own application. 한 번에 하나의 트랜잭션 만 "활성"이며 현재 트랜잭션을 커밋/롤백 할 때 다음 활성 트랜잭션은 가장 최근에 시작된 트랜잭션 (LIFO/스택 동작)입니다. 이것을 제어 할 수있는 방법을 찾지 못했습니다. 스프링 프레임 워크에 내장 된 것 같습니다.

3

예, 스프링을 사용할 때 다음과 같은 문제가 발생했습니다. java.lang.IllegalStateException : 트랜잭션 동기화를 비활성화 할 수 없습니다 - 활성화되어 있지 않습니다.

위에서 언급했듯이 Spring의 트랜잭션 관리에서는 트랜잭션을 LIFO 방식 (스택 동작)으로 커밋/롤백해야합니다. 문제는 사라집니다.

감사합니다.

관련 문제