Veri

ASP.NET Core ile POS'ta çift tahsilat ve negatif stoğu tasarımla önlemek

ASP.NET Core 10, EF Core ve SQL Server ile geliştirilen çok şubeli Tilly POS projesinde üç kritik hata, çift tahsilat, yarım kalan satış ve stok eksiye düşmesi, tasarım aşamasında nasıl önlendi? Yazar idempotency anahtarı, tek transaction ve koşullu UPDATE yaklaşımını somut kodla anlatıyor. Ödeme veya stok düşen her .NET servisi için pratik bir rehber.

DEV Community: #aspnetcore Zohaib Ahmad
Yayın tarihi
Okuma süresi
4 dk okuma
agent çalıştırması #14
agent çalıştırması #14
Orijinale git dev.to

Bu haberi bildir

Özette bir hata mı var, ya da bu içeriğin sahibi misin? Mesajın doğrudan bana e-posta olarak gelir.

Mesaj türü

Kilit noktalar

  • Her satış için tek bir idempotency anahtarı üretin, her yeniden denemede aynı anahtarı gönderin ve istek özetini birlikte saklayın.
  • Anahtarın benzersizliğini yalnızca kod kontrolüyle değil, business ve key üzerinde unique index ile veritabanında garanti edin.
  • Ödeme, stok hareketi, fiş sırası ve denetim kaydını tek transaction içinde yazın.
  • Fiş numarasını transaction içinde ayırın; başarısız satış numara boşluğu bırakmaz.
  • Stoğu UPDLOCK ve ROWLOCK ile koşullu tek bir UPDATE ile düşün ve satır kilitlerini sabit bir sırayla alın.
  • Stoğu bakiye yerine hareket defteri olarak tutun; her değişiklikte sonrasındaki bakiye kaydedilsin.

Gerçek bir mağazada çalışan bir POS uygulaması ağ kopmaları, çift tıklamalar ve aynı ürünü aynı anda satan iki kasa ile başa çıkmak zorunda. ASP.NET Core 10, Entity Framework Core ve SQL Server ile geliştirilen çok şubeli Tilly POS projesini anlatan bu yazıda yazar, bu tür üç hatanın baştan nasıl tasarımdan çıkarıldığını gösteriyor.

İlk savunma hattı, her satış için bir kez üretilip her denemede gönderilen idempotency anahtarı. Anahtar, istek özetiyle birlikte saklanıyor ve veritabanındaki benzersiz indeksle korunuyor; aynı anahtarla farklı bir sepet gelirse istek reddediliyor. Ödeme, stok, fiş numarası ve denetim kaydı yazımları tek bir transaction içinde çalışıyor. Stok ise tek bir koşullu ve satır kilitli UPDATE ile düşülüyor; kontrol ve yazma ayrılmadığı için stok eksiye düşmüyor.

Gerçek dünyada kullanımı

  • Ağ kopmalarının tekrarlı ödeme isteklerine yol açtığı bir perakende veya restoran checkout API'si.
  • Aynı ürünün son adedinin iki farklı terminalden aynı anda satılabildiği çok kasalı bir stok sistemi.
  • Muhasebe için boşluksuz ardışık belge numarası gereken bir sipariş veya fatura servisi.

Neden önemli

Para tahsil eden ya da stok düşen her .NET servisi aynı yarış koşullarıyla karşılaşabilir; burada anlatılan unique index ve koşullu UPDATE desenleri POS dışında da geçerlidir. Bu hataların çoğu yalnızca gerçek bir veritabanına karşı ortaya çıktığı için testlerin SQL Server üzerinde çalışması gerekir.

Bu özet, DEV Community: #aspnetcore üzerindeki orijinal yazıdan agent tarafından üretildi. Yazının tamamı ve tüm hakları ilgili yazara/yayıncıya aittir. Orijinal yazıya git

Benzer haberler

Geri bildirim

Bir hata mı buldun, bir fikrin mi var? Yazdığın mesaj doğrudan bana e-posta olarak gelir.

Mesaj türü