Veri katmanı ve SQL
Transaction, eşzamanlılık ve tutarlılık
Ya hep ya hiç: birden çok değişikliği güvenle yazmak ve aynı kaydı iki kişinin değiştirmesi.
Kavramı anlayalım
Transaction, birden çok değişikliği tek bir bölünmez birim yapar: ya hepsi kaydedilir ya hiçbiri. EF Core’da tek bir SaveChanges çağrısı zaten bir transaction içinde çalışır; aynı çağrıda eklenen yazı ve etiketleri birlikte yazılır veya birlikte geri alınır. Birden çok SaveChanges’i birleştirmek gerektiğinde açık bir transaction başlatılır.
Transaction’lar kısa tutulmalıdır. Açık bir transaction kilit tutar ve bağlantıyı meşgul eder; içinde e-posta göndermek veya dış bir API çağırmak, diğer istekleri bekletir ve havuzu tüketir. Dış etkiler, veritabanı işlemi başarıyla bittikten sonra yapılmalıdır.
Eşzamanlılık, iki kullanıcının aynı kaydı aynı anda değiştirmesidir. ‘Son yazan kazanır’ yaklaşımında birinin değişikliği sessizce kaybolur. İyimser eşzamanlılık bunu önler: kayıtla birlikte bir sürüm (rowversion) okunur ve güncelleme yalnız sürüm değişmediyse uygulanır. Değiştiyse EF Core DbUpdateConcurrencyException fırlatır ve kullanıcıya ‘bu kayıt sen düzenlerken değişti’ denebilir.
Yarım kalmış veya sessizce ezilmiş veri, en zor fark edilen hatalardandır.
Transaction açıkken HTTP çağrısı yapmak veya e-posta göndermek.
Aynı konu. Üç farklı derinlik.
db.Posts.Add(post);
db.PostTags.AddRange(tags);
await db.SaveChangesAsync(ct); // ikisi birlikte yazılır veya hiçbiriTek SaveChanges kendi transaction’ı içinde çalışır.
Bu sayfa gerçek bir sunucuya veya veritabanına bağlanmaz. Kod örnekleri .NET 8, Next.js ve SQL Server için temsilîdir; süreler simülasyondaki örnek değerlerdir, ölçüm değildir. Örnekleri yalnız kendi geliştirme ortamında dene; gerçek bağlantı dizesi, token veya parola paylaşma.
Önce kendin dene.
İki sekmede aynı blog yazısı açık. Birinde başlık, diğerinde içerik değiştirilip sırayla kaydediliyor. Sürüm kontrolü yoksa ne olur? Varsa ne olur?
Çözümü ve açıklamasını göster
Yoksa: ikinci kayıt, ilk sekmenin yüklediği eski başlığı da yazar → başlık değişikliği kaybolur.
Varsa: ikinci kayıt 409 alır; kullanıcı güncel hali görüp değişikliğini yeniden uygular.İyimser eşzamanlılık, kayıp güncellemeyi sessiz bir hata olmaktan çıkarıp görünür bir çakışmaya çevirir.