2011-04-20 5 views
2

두 개의 다른 데이터베이스가있는 시나리오에서 두 데이터베이스의 다른 변경을 커밋하고 커밋 중 하나가 실패하면 다른 하나도 실패합니다.두 트랜잭션을 함께 바인딩하는 방법?

'데이터베이스 A'와 '데이터베이스 B'의 '트랜잭션 B'가있는 경우 두 트랜잭션을 모두 바인드하여 둘 다 원자 적으로 성공하거나 실패 할 수 있습니다.

나는 이것을 수행하는 방법을 알 수 없다. '트랜잭션 A'가 실패하면 '트랜잭션 B'를 롤백하기 쉽지만 '트랜잭션 A'가 이미 커밋 된 경우 '트랜잭션 B'가 실패하면 망가집니다.

특정 데이터베이스 제품에서이 문제를 처리 할 수있는 기술이 있는지 알고 싶습니다. 데이터베이스 바인딩과 같은 트랜잭션 시스템에도 적용 할 수있는이 시나리오를 처리하는 일반적인 패턴이 있으면 더 좋을 것입니다. 트랜잭션 메시지 큐와의 트랜잭션.

답변

2

분산 트랜잭션 관리자를 사용해야합니다 (가장 간단한 경우 프로그램 자체가 작동 할 수 있습니다).

X/OpenXA은 분산 트랜잭션을 관리하는 데 가장 널리 사용되는 표준이며 큰 4 개의 모든 데이터베이스는 기본적으로이를 지원합니다.

0
using (TransactionScope scopeExternal = new TransactionScope()) 
{ 
    using (TransactionScope scope1 
      = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     ... operations for 1st DB 
     scope1.Complete(); 
    } 


    using (TransactionScope scope2 
      = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     ... operations for 2nd DB 
     scope2.Complete(); 
    } 

    scopeExternal.Complete(); 
} 

은 커밋 scopeExternal 거래 방지 예외가 발생 scope1 또는 scope2 중 하나에서 모든 트랜잭션이 실패합니다.

관련 문제