2011-01-22 7 views
2

데이터베이스, 일부 네트워크 제어 도구 및 기타 SOAP 기반 서비스를 비롯한 여러 데이터 소스에서 일관된 변경 사항 집합을 관리 할 수있는 방법을 찾고 있습니다.취소 불가능한 변경 집합

어떤 이유로 변경이 실패한 경우 (예 : 실제 앱에서 '아니요'라고 표시되거나 데이터베이스 삽입이 실패하는 경우), 전체 설정을 취소해야합니다. 따라서 거래는 마치 DB에만 국한되지 않습니다.

나는 init, commit 및 rollback 메소드를 갖는 "change"객체를 스택하는 모듈을 만들었다. 세트가 DESTROY 될 때 커밋되지 않은 변경 사항을 롤백합니다. 이것은 다소 효과적이다.

아직도 나는 발명되고있는 바퀴의 느낌을 극복 할 수 없다. 표준 CPAN 모듈이 있습니까? 아니면 그런 작업을 수행하기 위해 잘 설명 된 일반적인 방법이 있습니까? (당신이 설명하는지 인)을 Distributed transaction을 실행에

답변

2

이 접근 방식의 몇 가지가 있습니다 (최소한의 GoF의는 "명령"패턴 RAII 원칙은 ... 마음에 와서) :

  1. 표준 패턴을 "Two-phase commit 프로토콜"이라고합니다.

    현재로서는 2 단계 커밋을 구현하는 Perl 모듈에 대해 알지 못합니다. 놀라운 일이지만 Google 검색의 경과로 인해 발생할 수 있습니다. 내가 발견 한 유일한 것은 Env::Transaction이었습니다. 그러나 나는 그것이 얼마나 안정적인지/좋은/기능적인지 전혀 알지 못합니다.

  2. 경우에 따라 "Compensating transactions"을 통한 롤백과 관련된 솔루션이 가능합니다.

    이것은 기본적으로 대상 시스템 상태를 S1에서 S2로 변경하도록 설계된 작업 목록 A를 생성 할 때 "보상"작업 목록을 생성하는 일반적인 롤백의 특별한 경우입니다. 변경을 위해 설계된 A-neg 대상 시스템 상태는 S2에서 S1으로 돌아갑니다. 이는 분명히 특정 시스템에서만 가능하며 그 중 일부는 교환 적입니다 (즉, A + B + A-neg + B-neg의 결과는 불변 상태입니다).

    보상하는 거래가 항상 "거래"가되도록 고안 될 필요는 없다는 것을 알아 두십시오 - 똑똑한 접근법 (특정 주제 영역에서만 가능)은 특수한 "완료"깃발을 사용하여 데이터를 저장 한 다음 정기적으로 데이터를 수집하고 파괴합니다 데이터의 '원본 트랜잭션 타임 스탬프'가 일종의 임계 값보다 오래된 경우 false 'finalized'플래그가 표시됩니다.

+0

감사합니다. 귀하의 회신, 나는 다시 그것을 열 수 있었으면 좋겠다. 나는 보상 거래를 구현했다. – Dallaylaen

관련 문제