2011-03-07 5 views
2

데이터베이스의 레코드를 업데이트하기 위해 WCF 서비스가 호출되었습니다. 연결이 끊어지면 서비스는 계속 데이터를 처리하지만 클라이언트는 결과를 알 수 없습니다. I.E. 처리가 성공 또는 실패했을 수 있습니다. 클라이언트는 데이터를 재전송해야하는지 알지 못합니다.WCF 서비스 : 연결 처리가 끊어졌습니다.

일반적인 예는 은행 예금입니다. ATM은 예금을 받고 WCF 전화를 걸어 고객의 계정을 업데이트합니다. 연결이 끊어 지므로 입금 처리 여부가 ATM에 불확실합니다. 그렇지 않고 ATM이 다시 보내지 않으면 고객은 그의 계좌에 돈을 가지고 있지 않습니다. 현금 인출기가 재발송 되었으나 예치금이 처리 된 경우, 그는 두 개의 예치금을 받게됩니다.

WCF 서비스 호출에서 트랜잭션을 활성화하는 것은 문제가되지 않지만 연결이 끊어지면 처리 할 수 ​​있습니까? I.E. 클라이언트가 서버에 연결이 끊어지면 트랜잭션을 롤백 할 수 있지만 클라이언트가 연결되어 있지 않으면 서버가 롤백을 어떻게 알 수 있습니까?

+0

어 ... "TIA, James"가 질문에 추가하기 적합하지 않습니까? 왜 그걸 지우셨습니까? –

답변

1

심각한 결과를 초래할 수있는 문제가 있습니다.

비동기 클라이언트 호출을 사용 중이거나 서비스 측에서 수행중인 처리량이 비교적 많다고 가정합니다. 대기 시간의 범위에서 클라이언트의 서비스에 대한 연결이 끊어지면 클라이언트가 서비스가 마지막으로 남은 상태를 알 수있는 방법이 없습니다. 중간 트랜잭션 인 경우 서비스 측 트랜잭션 자동으로 캔슬 될 것입니다 ... 만약 포스트 - 트랜잭션 이었으면 당신의 일은 끝났습니다 ...하지만 두 상황 모두에서 클라이언트는 "결코 알지 못할 것입니다".

이론적으로 ... ATM에서 보증금을 결제하는 과정에서 연결이 끊어지면 이론적으로는 (하지만 논리적 인 시나리오처럼 들린다.) 나는 믿는다. 나는 ATM 자체가 트랜잭션 목록을 메모리에 저장하여 트랜잭션이 실패한 상황에서 일단 연결이 재설정되면 트랜잭션을 실제로 확인하고 트랜잭션이 실제로 완료되었는지 확인할 수 있도록합니다. (현실에서는이 일을하지 않으면 ... 나는 개인적으로 조금 걱정할 것입니다.)

긴 이야기를 짧게 만들려면 ...이 시나리오에서 할 수있는 유일한 방법은 클라이언트 쪽에서 서비스 쪽과 일치하는 일종의 체크섬을 유지하여 연결 실패가 발생할 경우, 연결이 다시 설정되면 서비스가 실제로 완료되었는지 여부를 확인하기 위해 서비스를 확인할 수 있습니다.

+0

연결이 완료되면 확인하는 것이 좋습니다.하지만 확인할 사항은 무엇입니까? 최근 $ 100 예치금이 있었습니까? 신뢰할 수는 없습니다 ... 공동 작업자가 제안한 것은 WCF 서비스에서 트랜잭션 ID를 요청하고이를 실제 예금 통화로 전달하는 것이 었습니다. –

+0

당신은 당신이 원한 것을 요청할 수 있습니다. 당신이 원할 때까지 ... 당신은 트랜잭션 자체로부터 데이터를 해쉬 할 수 있고 해시 클라이언트 측에도 체크 할 수 있습니다. 너의 권리. 매우 복잡하고 신속하게 처리 할 수 ​​있습니다. – Patrick

0

BizTalk와 같은 EAI 공급자를 사용하여 WCF 서비스를 조정하고 서비스가 노출하는 각 작업에 대해 보완 작업을 설정하여 오류 발생시 롤백을 수행 할 수 있습니다.

+0

더 자세히 살펴 보겠습니다 ... 지금은 큰 학습 곡선이고 소프트웨어/하드웨어/설정이 많습니다 ... 단기간에 할 수 있다고 생각하지 않습니다. ( –

관련 문제