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ç.