2012-06-28 2 views
1

현재 은행 계좌가 있다고 가정하고 균형이 낮은 경우 자동으로 저축 예금 계좌에서 송금합니다. 그래서, 나는 WCF 코드 아래에 쓴 : 나는 동일한 서비스를 호출하는 여러 클라이언트가있을 때WCF 데이터 동기화

//Servicer side: 

[ServiceContract] 
public interface IBankAccount 
{ 
    [OperationContract] 
    double withdraw(double amount); 

    [OperationContract] 
    double enquiry(); 
} 

class BankAccountService:IBankAccount 
{ 
    public double enquiry() 
    { 
     return balance; 
    } 
    public double withdraw(double amount) 
    { 
     while (balance < amount) 
     { 
      transferMoreMoney(); 
     } 

     deduct(amount); 

     return balance; 
    } 

    public void deduct(double amount) 
    { 
     System.Threading.Thread.Sleep(10000); 
     balance -= amount; 
    } 

    public void transferMoreMoney() 
    { 
     System.Threading.Thread.Sleep(10000); 
     balance += maximizeTransferAmount; 
    } 

    private static double balance; 
    private double maximizeTransferAmount = 100.0; 
} 


//Client side: 
    ServiceReference1.BankAccountClient client = new ServiceReference1.BankAccountClient(); 
     while (true) 
     { 
      try 
      { 

       string tmpStr = Console.ReadLine(); 
       if (tmpStr == "") 
        break; 

       double v0 = client.enquiry(); 
       Console.WriteLine("Current balance is:{0}", v0); 

       double v1 = Convert.ToDouble(tmpStr); 
       Console.WriteLine("Amount withdrawn is:{0}", v1); 

       double v2 = client.withdraw(v1); 
       Console.WriteLine("Remaining balance is:{0}", v2); 
      } 
      catch (CommunicationException e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 

문제는,의 잔고가 마이너스가 될 수있다. 어떻게 저울이 부정적으로 끝나지 않고 시간 내에 보충 될 수 있도록 보장 할 수 있습니까?

또한 균형적인 쿼리 만 실행하는 다른 클라이언트가 있으므로 쿼리 만 수행하면 기다리지 않아야합니다. 누가이를 보장해야합니까?

이것은 내가 필요한 것을 보여주는 예일뿐입니다. 이 예는 내가 다루어야 할 기술적 인 문제를 보여 주지만 실제로는 그렇지 않다. 내 실제 사례는 메모리에서 고성능 실시간 계산이 필요한 데이터베이스이므로 데이터베이스를 사용할 수 없으므로 데이터베이스가 옵션이 아닙니다.

기본적으로 여러 클라이언트가 동일한 데이터를 공유하는 동일한 서비스를 호출 할 때 WCF 서비스에서 "잠금"과 비슷한 것이 있습니까?

대단히 감사합니다. 사실 당신이 concurentcy 모드 싱글 BankAccountService 서비스를 모든 호출을 대기하고 요청이 하나씩 실행됩니다 ConcurrencyMode.Single을 사용하고 있어야합니다

답변

3
you must define behavior specific for your service wcf (Singleton Instance Mode + Concurrency Mode Multiple) 

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
     ConcurrencyMode = ConcurrencyMode.Multiple)] 
    public class BankAccountService: IBankAccount 
    { 

    } 

Note : You can also define your behavior in config file 
+0

안녕하세요. 도움을 주셔서 대단히 감사합니다. 위와 같이 서비스 동작 정의를 추가했습니다. 그러나 그것은 여전히 ​​나에게 내가 원하는 결과를주지 않았다. 두 명의 고객이 90 명을 인출 할 필요가 있고 잔액이 100 인 경우 첫 번째 클라이언트는 10의 순 잔액을 반환하고 다음 클라이언트는 -80의 순 잔액을 반환합니다. 어떻게해야합니까? – Michael

+0

Hello Mihael,이 경우 ConcurrencyMode = ConcurrencyMode.Multiple을 ConcurrencyMode = ConcurrencyMode.Single로 바꿉니다. –

3

. ConcurrencyMode.Multiple을 사용하려면 스레드 잠금을 구현해야합니다.

+0

대단히 고맙습니다. 스레드 잠금이 작동합니다 ... – Michael