현재 은행 계좌가 있다고 가정하고 균형이 낮은 경우 자동으로 저축 예금 계좌에서 송금합니다. 그래서, 나는 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을 사용하고 있어야합니다
안녕하세요. 도움을 주셔서 대단히 감사합니다. 위와 같이 서비스 동작 정의를 추가했습니다. 그러나 그것은 여전히 나에게 내가 원하는 결과를주지 않았다. 두 명의 고객이 90 명을 인출 할 필요가 있고 잔액이 100 인 경우 첫 번째 클라이언트는 10의 순 잔액을 반환하고 다음 클라이언트는 -80의 순 잔액을 반환합니다. 어떻게해야합니까? – Michael
Hello Mihael,이 경우 ConcurrencyMode = ConcurrencyMode.Multiple을 ConcurrencyMode = ConcurrencyMode.Single로 바꿉니다. –