Spring이 우리의 트랜잭션을 관리 할 수 있도록 Spring의 PlatformTransactionManager
을 사용하기 위해 기존 트랜잭션 API를 개조하고자합니다. 다음과 같이 내 DataSource
들 체인 :Spring의 PlatformTransactionManager는 트랜잭션을 특정 순서로 커밋해야합니까?
DataSourceTransactionManager
->LazyConnectionDataSourceProxy
->dbcp.PoolingDataSource
->OracleDataSource
DataSourceTransactionManager
실험에서
, 내가 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에서 관리하지 않으므로 실제로는 옵션이 아닙니다.
감사합니다.
'PROPAGATION_REQUIRES_NEW'는 트랜잭션을 전혀 커밋/롤백 할 필요가 없어야하며 기존 트랜잭션을 일시 중단하고 새 트랜잭션을 시작해야합니다. – skaffman