ACID Özellikleri: Bir Veritabanı İşlemini Güvenilir Kılan Dört Garanti
ACID, veritabanı işlemlerinin güvenilir olması için gereken atomiklik, tutarlılık, yalıtım ve dayanıklılık özelliklerinin adıdır. Örnekle açıklıyoruz.
ACID nedir?
ACID, bir veritabanı işleminin (transaction) güvenilir sayılması için sağlaması gereken özelliklerin baş harflerinden oluşur: Atomicity (atomiklik), Consistency (tutarlılık), Isolation (yalıtım) ve Durability (dayanıklılık). Bu özellikler sayesinde sistem çökse, aynı anda çok sayıda kullanıcı çalışsa ya da işlemin ortasında hata çıksa bile veri doğru ve bütün kalır.
İşlem, bir bütün olarak ele alınan bir grup okuma ve yazma adımıdır. Klasik örnek banka havalesidir: bir hesaptan para düşülmesi ve diğer hesaba eklenmesi ayrı ayrı yazma gibi görünse de mantıken tek bir iştir. Biri olup diğeri olmazsa para kaybolur ya da çoğalır. ACID, tam bu tür durumları engellemek için tasarlanmış bir sözleşmedir.
Dört özellik tek tek ne anlama gelir?
Atomiklik: işlem ya bütünüyle uygulanır ya da hiç uygulanmamış sayılır. Ortadaki bir hata, o ana kadar yapılan değişikliklerin geri alınmasını (rollback) tetikler. Yarım kalmış bir işlem veritabanında iz bırakmaz.
Tutarlılık: işlem veritabanını geçerli bir durumdan başka bir geçerli duruma taşır. Tanımlı kurallar (yabancı anahtarlar, benzersizlik kısıtları, kontrol kuralları) işlem bitince de sağlanmış olmalıdır. Eksi bakiyeye izin vermeyen bir kuralı ihlal eden işlem reddedilir.
Yalıtım: aynı anda çalışan işlemler birbirinin yarım kalmış sonuçlarını görmemelidir. Her işlem, sanki sistemde tek başınaymış gibi davranır. Yalıtımın ne kadar sıkı olacağı izolasyon seviyeleriyle ayarlanır.
Dayanıklılık: işlem onaylandıktan (commit) sonra elektrik kesilse ya da sunucu çökse bile sonuç kalıcıdır. Veritabanları bunu genellikle önce bir işlem günlüğüne (write-ahead log) yazarak sağlar.
Nasıl çalışır: bir havale örneği
Örneğin Ayşe hesabından Mehmet'in hesabına havale yapıyor. Uygulama işlemi başlatır, Ayşe'nin bakiyesini düşürür, Mehmet'in bakiyesini artırır ve onaylar. Eğer havalenin alacaklı tarafı yazılırken sunucu hata verirse atomiklik sayesinde borçlandırma da geri alınır; paranın yalnızca bir tarafta eksilmiş olması mümkün olmaz.
Aynı sırada başka bir işlem Ayşe'nin bakiyesini okumaya çalışırsa yalıtım devreye girer. Okuyan işlem ya havale öncesindeki ya da sonrasındaki tutarlı değeri görür; yarım kalmış ara değeri görmez.
İşlem onaylandıktan hemen sonra veritabanı sunucusu çökerse dayanıklılık sayesinde yeniden başlatma sırasında günlük kaydından işlem yeniden oynatılır ve havale kaybolmaz. Bu mekanizmalar birlikte tutarlılığı güvence altına alır.
İzolasyon seviyeleri ve eşzamanlılık anomalileri
Yalıtım, performans ile doğruluk arasında bir ödünleşmedir. Mutlak yalıtım, işlemlerin sırayla çalışması demektir ve eşzamanlılığı düşürür. Bu yüzden veritabanları ayarlanabilir izolasyon seviyeleri sunar: Read Uncommitted, Read Committed, Repeatable Read ve Serializable.
Düşük seviyelerde şu anomaliler görülebilir: • Kirli okuma (dirty read): henüz onaylanmamış başka bir işlemin değişikliğini okumak. • Tekrarlanamayan okuma (non-repeatable read): aynı satırı aynı işlemde yeniden okuyup farklı değer görmek. • Hayalet okuma (phantom read): aynı sorguyu tekrarlayınca yeni satırların ortaya çıkması.
Seviye yükseldikçe bu anomaliler azalır, ancak kilitleme ya da çakışma kontrolü maliyeti artar. Bir sistemde hangi seviyenin kullanılacağı, işin hata toleransına ve yük profiline göre seçilir.
ACID ile BASE ve NoSQL ilişkisi
ACID, ilişkisel veritabanlarıyla (PostgreSQL, MySQL, SQL Server ve Oracle gibi) özdeşleşmiş olsa da bu özellik ilişkisel olmayan sistemlerde de bulunabilir. Birçok güncel NoSQL ürünü belge düzeyinde ya da çoklu belge işlemlerinde ACID garantisi sunar.
ACID'in karşısında sıkça anılan BASE yaklaşımı (Basically Available, Soft state, Eventually consistent), özellikle dağıtık ve çok yüksek ölçekli sistemlerde tutarlılığı anlık değil zaman içinde sağlamayı kabul eder. Bu tercih bir üstünlük değil bir tasarım kararıdır: ödeme ve stok gibi doğruluğun kritik olduğu alanlar ACID'e, akış ve öneri gibi gecikmeli tutarlılığın yeterli olduğu alanlar BASE'e daha yatkındır.
Mikroservis mimarilerinde tek veritabanı işlemi servis sınırlarını aşamaz; bu durumda saga deseni ve telafi edici işlemler gibi yöntemlerle uçtan uca tutarlılık sağlanır.
Uygulama geliştiricinin dikkat etmesi gerekenler
ACID veritabanının sunduğu bir garantidir, ancak uygulama kodu işlem sınırlarını doğru çizmedikçe kendiliğinden korunmaz. İş açısından bölünemez olan adımların aynı işlem içinde olması gerekir. Gereksiz uzun işlemler kilit tutar ve diğer kullanıcıları bekletir; bu nedenle işlem içinde dış servis çağrısı ya da kullanıcı beklemesi yapılmamalıdır.
Sık yapılan hatalar arasında, istemci tarafında otomatik onay (autocommit) açıkken adımların ayrı ayrı onaylanması, işlem kapsamı olmadan arka arkaya yazma yapılması ve çakışma durumunda yeniden deneme mantığının olmaması yer alır. Kilitlenme (deadlock) ihtimali için işlemlerin kaynaklara hep aynı sırayla erişmesi iyi bir pratiktir.
Bu konuyu uygulamalı öğrenmek isteyenler için Mindset'in Veritabanı İşlem Yönetimi ve İzolasyon Seviyeleri programı; işlem temelleri ve ACID, izolasyon seviyeleri ve okuma anomalileri, kilitleme ve eşzamanlılık kontrolü ile uygulama katmanı desenleri modüllerini içerir.
İlgili Mindset programı
Veritabanı İşlem Yönetimi ve İzolasyon Seviyeleri
Sık sorulan sorular
ACID'deki tutarlılık ile dağıtık sistemlerdeki tutarlılık aynı mıdır?
Hayır. ACID tutarlılığı, işlem sonunda tanımlı veri kurallarının sağlanması anlamına gelir. Dağıtık sistemlerdeki tutarlılık ise farklı kopyaların aynı anda aynı değeri göstermesiyle ilgilidir. Aynı sözcük farklı kavramları anlatır; bağlama bakmak gerekir.
Her veritabanı ACID uyumlu mudur?
Hayır. İlişkisel veritabanlarının çoğu varsayılan olarak ACID garantisi verir, ama bazı NoSQL ve önbellek sistemleri hız ya da ölçek için bu garantilerin bir kısmından vazgeçer. Kullandığınız ürünün hangi işlemleri, hangi kapsamda garanti ettiğini belgelerinden okumak gerekir.
Rollback ile commit ne işe yarar?
Commit, işlemin değişikliklerini kalıcı hale getirir ve diğer işlemlerin görmesine açar. Rollback ise işlem başladığından beri yapılan tüm değişiklikleri geri alır. Atomikliğin pratikteki karşılığı bu komutlardır: işlem ya onaylanır ya da tümüyle iptal edilir.
Yalıtımı en yüksek seviyeye çekmek neden her zaman çözüm değildir?
En yüksek yalıtım seviyesi anomalileri tümüyle önler, ama işlemleri büyük ölçüde sıraya sokar ve kilit bekleme ya da çakışma nedeniyle yeniden deneme oranını artırır. Yük altında yanıt süreleri uzar. Bu yüzden seviye, işin gerçekten ihtiyaç duyduğu doğruluğa göre seçilmelidir.
Dayanıklılık nasıl sağlanır?
Veritabanları değişiklikleri önce diske yazılan bir işlem günlüğüne kaydeder, sonra veri sayfalarına uygular. Çökme sonrası yeniden başlatmada günlük okunur; onaylanmış işlemler yeniden uygulanır, onaylanmamış olanlar geri alınır.