İçeriğe geç
pitonmert

ACID: Bir işlem neyi garanti eder?

Bir sipariş oluştururken sipariş kaydını eklediğini ve stoktan bir adet düşürdüğünü düşün. İkinci adım başarısız olursa ilk adımın kalması yanlış bir sonuç üretir. Veritabanı işlemi, bu değişiklikler için bir sınır oluşturur. ACID, bu sınırın dört özelliğini adlandırır: atomicity, consistency, isolation ve durability.

Bu yazı komut başvurusu değildir. BEGIN, COMMIT ve ROLLBACK kullanımını SQL kısa başvurusunda bulabilirsin.

İşlem sınırı

Örnekte orders tablosuna bir satır ekleniyor ve stock tablosundaki available değeri azaltılıyor. İki değişiklik aynı PostgreSQL işlemi içindeyse işlem tamamlandığında birlikte görünür; işlem geri alınırsa ikisi de kalmaz. Bu anlatım, söz konusu stok satırının bulunduğunu ve stok için gerekli kuralların ayrıca tanımlandığını varsayar.

İşlem sınırı doğru seçilmelidir: sipariş ve stok değişikliğini iki ayrı işlemde tamamlarsan ACID bunları kendiliğinden tek bir işleme dönüştürmez.

Atomicity — Bölünmezlik

Atomicity, işlemin veritabanındaki etkisinin ya tümüyle gerçekleşmesi ya da hiç gerçekleşmemesidir. Sipariş satırı eklendikten sonra stok güncellemesi hata verirse işlem tamamlanmaz; başarısız işlem geri alındığında sipariş satırı da kalmaz.

Bu özellik, bir işlemin içindeki her SQL komutunun tek tek başarılı olacağını söylemez. Hata durumunda uygulamanın işlemi uygun biçimde sonlandırması gerekir.

Consistency — Kurallara uygunluk

Buradaki consistency, tamamlanan verinin tanımlanmış bütünlük kurallarına uymasıdır. Örneğin stock.available >= 0 kuralı bir CHECK kısıtı olarak veritabanına eklenmişse negatif stokla biten işlem kabul edilmez.

Veritabanı kendisine tanımlanmamış bir iş kuralını bilemez. “Bir müşterinin aynı ürün için yalnız bir açık rezervasyonu olabilir” gibi bir kural, uygun kısıt veya uygulama mantığıyla ayrıca kurulmalıdır. CAP yazısındaki consistency ise farklı bir kavramdır.

Isolation — Eşzamanlı işlemler

İki müşteri son ürünü aynı anda sipariş etmek isteyebilir. Isolation, eşzamanlı işlemlerin birbirinin henüz tamamlanmamış değişikliklerini nasıl gördüğünü ve sonuçlarının nasıl etkileştiğini belirler.

PostgreSQL’in varsayılan Read Committed düzeyinde her sorgu, başladığı anda tamamlanmış verilerin bir görünümünü kullanır. Aynı işlemdeki iki ayrı okuma, arada başka bir işlem tamamlanırsa farklı sonuç görebilir. Bu yüzden “işlem kullandım, bütün eşzamanlılık sorunları çözüldü” sonucu çıkarılamaz. Daha güçlü bir yalıtım düzeyi veya uygun kilitleme gereken senaryolar vardır; Serializable kullanan uygulamalar da yeniden deneme gerektiren hatalara hazırlıklı olmalıdır.

Durability — Kalıcılık

Durability, veritabanının tamamlandığını bildirdiği işlemin değişikliklerini daha sonraki bir çökme sonrasında da korumasıdır. Siparişin COMMIT işlemi başarıyla onaylandıktan sonra sunucunun yeniden başlaması, normal kalıcılık ayarları altında siparişi kaybettirmemelidir.

Bu, ekrandaki bir sorgu sonucuyla kanıtlanamaz; depolama ve günlükleme davranışıyla ilgilidir. PostgreSQL’de kalıcılığı gevşeten ayarlar bulunduğu için gerçek güvenceyi kullanılan yapılandırmayla birlikte değerlendirmek gerekir.

ACID neyi garanti etmez?

  • Veritabanı işlemi, aynı anda gönderilen e-postayı veya başka bir servisteki değişikliği kendiliğinden geri almaz.
  • İşlem, uygulamanın hiç tanımlamadığı iş kurallarını oluşturmaz.
  • Varsayılan yalıtım düzeyi her eşzamanlı yürütmeyi seri yürütmeyle eşdeğer kılmaz.

Birden çok veri kopyası arasındaki ağ kesintisi farklı bir sorudur. Bunun için CAP ve BASE yazısına geç.

Kaynaklar