클라이언트에서 지불을 처리하는 간단한 서비스 (예 : C#, SQL Server, Entity Framework)를 구현하려고합니다. 예를 들어, 나는 가능한 동시성 문제입니다 대해 걱정 무엇Entity Framework를 사용하여 올바른 동시성/잠금 메커니즘을 선택하는 방법
public void ExecutePayment(int productId, PaymentInfo paymentInfo)
{
using (var dbContext = new MyDbContext())
{
var stats = dbContext.PaymentStatistics.Single(s => s.ProductId== productId);
var limits = dbContext.Limits.Single(l => l.ProductId == productId);
int newPaymentCount = stats.DailyPaymentCount + 1;
if (newPaymentCount > limits.MaxDailyPaymentCount)
{
throw new InvalidOperationException("Exceeded payment count limit");
}
// other limits here...
var paymentResult = ProcessPayment(paymentInfo); <-- long operation, takes 2-3 seconds
if (paymentResult.Success)
{
stats.DailyPaymentCount = newPaymentCount;
}
dbContext.SaveChanges();
}
}
: 하나의 제품 이상 10 회 등)을 구입할 수 없습니다
코드의 단순화 된 버전은 다음과 같다. 두 스레드/프로세스가 동시에 확인/업데이트를 시작하는지 확인해야합니다. 그렇지 않으면 통계가 동기화되지 않습니다. stats.PaymentCount
이 같은 (this implementation를 사용하여 예를 들어) 분산 잠금으로 전체 방법을 포장에 대해 생각했다 :
string lockKey = $"processing-payment-for-product-{productId}";
var myLock = new SqlDistributedLock(lockKey);
using (myLock.Acquire())
{
ExecutePayment(productId, paymentInfo);
}
그러나이 방법 우려가 ProcessPayment 매우 느린 것입니다 (2-3 초)입니다 이는 동일한 제품에 대한 동시 지불 요청이 한도를 확인하기까지 2-3 초 정도 기다려야한다는 것을 의미합니다.
누구나이 경우에 적합한 잠금 솔루션을 제안 할 수 있습니까?
데이터베이스에도 결제를 저장 하시겠습니까? 보류/실패/완료 지불을 나타내는 일부 지불 오브젝트를 의미합니다. – Evk
@Evk, 예, SQL Server는 현재 모든 종류의 응용 프로그램 데이터에 대한 유일한 저장소 메커니즘입니다. –