İçeriğe atla
Veri bütünlüğü

Mükerrer fatura kaydı nasıl oluşur, nasıl engellenir?

Aynı faturanın iki kez düşmesinin üç ayrı yolu var ve üçü de farklı bir çözüm istiyor. Hiçbiri “dikkatli olun” değil.

Workpro ekibi · 22 Ocak 2026 · 6 dakikalık okuma

AYNI ANDA GELEN İKİ İSTEK İstek A İstek B Veritabanı Fatura tablosu 1. “Bu dış kimlik var mı?” 2. Cevap: yok 1. “Bu dış kimlik var mı?” 2. Cevap: yok İKİSİ DE “YOK” CEVABINI ALDI 3. Fatura ekle 3. Fatura ekle Sonuç: iki kayıt Kod doğru görünüyor, testte hata vermiyor.

Mükerrer kayıt tek bir hatanın sonucu değil — birbirinden bağımsız üç ayrı sebebin aynı belirtiyi üretmesi. Hangi sebebe karşı önlem aldığınızı bilmezseniz, birini kapatıp diğerinden girmesini izlersiniz.

1. İnsan iki kere giriyor

Klasik senaryo: fatura muhasebe programına girildi, ERP’ye de girilmesi gerekiyordu, iki kişi de girdi. Ya da aynı kişi girdiğini unuttu.

Çözüm: belge numarası üzerinde benzersizlik. Aynı seri-numara ikinci kez kaydedilemez. Basit ama çoğu yerde yok, çünkü “numara boş bırakılabilsin” esnekliği için feda edilmiş.

2. Aktarım tekrarlanıyor

Toplu aktarımı iki kez çalıştırdınız. Ya da ilk çalıştırma yarıda kaldı, yeniden başlattınız; ilk yarının yazdıkları zaten duruyordu.

Çözüm: kaynaktaki kimliği hedefte saklamak. Paraşüt’ten gelen her faturanın Paraşüt’teki kimliği kayda yazılır; aynı kimlik ikinci kez gelirse kayıt güncellenir, yenisi açılmaz. Buna idempotent aktarım denir ve aktarım yazılımında pazarlık konusu değildir.

3. Eşzamanlılık

En sinsi olanı. İki kullanıcı — ya da bir kullanıcı ile zamanlanmış bir iş — aynı anda aynı faturayı işliyor. Kodunuzda şu var:

var mevcut = await db.Fatura.FirstOrDefaultAsync(f => f.DisId == disId);
if (mevcut is null) db.Fatura.Add(yeni);   // ← iki istek de buraya girer

İki istek de null cevabını alır, ikisi de ekler. Kod doğru görünüyor ve test ortamında hiç hata vermiyor, çünkü testte iki istek aynı anda gelmiyor.

Çözüm: kontrolü uygulamadan veritabanına taşımak. İlgili sütunlar üzerinde benzersiz dizin varsa ikinci yazma başarısız olur — hangi sırayla geldiklerinden bağımsız olarak. Uygulama bu hatayı yakalar ve “zaten var” diye işler.

Neden veritabanı kısıtı

Uygulama kodundaki kontrol bir niyet beyanıdır; veritabanı kısıtı bir garantidir. Aradaki fark, kodun bir yerinde o kontrolü yazmayı unutan geliştiricinin (ya da doğrudan veriye dokunan bir betiğin) yaptığı hasarda ortaya çıkar.

Hangi alanlar benzersiz olmalı

KayıtBenzersizlikKapsam
FaturaSeri + belge numarasıFirma içinde
Aktarılan kayıtKurulum + tür + kaynak kimliğiFirma içinde
CariCari koduFirma içinde
StokStok koduFirma içinde

“Firma içinde” kısmı çok şirketli sistemlerde kritik: kısıt firma sütununu içermezse iki ayrı şirketin aynı fatura numarasını kullanması imkânsız hale gelir.

Mükerrer kayıt zaten oluştuysa

Silmeden önce hangisinin doğru olduğuna karar verin. Genellikle biri cari hareketi yazmış, diğeri yazmamıştır; ya da biri stok hareketine bağlıdır. Yanlış olanı silmek yetmez, ona bağlı hareketleri de temizlemek gerekir.

Bunu elle yapmadan önce: benzersizlik kısıtını ekleyin. Aksi halde temizliği bitirdiğinizde yenileri oluşmaya başlamış olur.

Workpro’nun bunu nasıl ele aldığı →

Demo

Kendi verinizle bakmak en hızlısı

Otuz dakikalık bir ekran paylaşımı. Sizin işinize benzeyen bir akışı — teklif, sipariş, fatura, stok — çalışan ekranda birlikte geziyoruz. Muhasebe programınız bağlanabiliyorsa birkaç faturayı çekip sonucu birlikte bakıyoruz. Sunum yok, slayt yok.