Ders 13 / 14
ACID Özellikleri
İşlem kavramı ve atomiklik, tutarlılık, yalıtım, kalıcılık güvencelerinin tanımı; geri alma ve kalıcılığın çalıştırılarak gösterimi, istemcinin hata karşısındaki sorumluluğu.
İçindekiler
Önceki ders iki kez aynı varsayıma dayandı: bir ödünç kaydının yazılması ya tümüyle olur ya hiç olmaz, ve bir çözümleme sorgusu yarım yazılmış bir durumu görmez. Aynı varsayımlar kursun ilk dersinde de geçmişti — dosyaya eşzamanlı yazan iki süreç ikisini de sağlayamamıştı. Bu dersin sorusu şudur: veritabanı yönetim sistemi bu güvenceleri hangi adla, hangi sınırlar içinde verir?
İşlem
İşlem (transaction), veritabanı üzerinde tek bir birim gibi ele alınan deyimler dizisidir. Bir nüshanın bir şubeden diğerine aktarılması iki güncelleme gerektirir; ikisi birlikte olmalıdır, çünkü aralarında kalan durumda kütüphanede bir nüsha eksiktir.
İşlemin sınırları açıkça bildirilir: başlangıç, ardından ya onaylama (commit) ya da geri alma (rollback). Bildirilmediğinde her deyim kendi başına bir işlem sayılır.
İşlemlerin verdiği güvenceler dört başlık altında toplanır ve baş harfleriyle ACID diye anılır: atomiklik, tutarlılık, yalıtım, kalıcılık.
Atomiklik
Atomiklik (atomicity), işlemin ya tamamen uygulanmasını ya da hiç uygulanmamasını ister. Ara durum hiçbir zaman kalıcı olmaz.
sqlite3 :memory: <<'SQL' .headers on .mode box CREATE TABLE stok (sube_kodu TEXT NOT NULL, isbn TEXT NOT NULL, adet INTEGER NOT NULL, PRIMARY KEY (sube_kodu, isbn), CHECK (adet >= 0)); INSERT INTO stok VALUES ('MRK', '975-01', 3), ('BHC', '975-01', 1); BEGIN; UPDATE stok SET adet = adet - 1 WHERE sube_kodu = 'MRK' AND isbn = '975-01'; UPDATE stok SET adet = adet + 1 WHERE sube_kodu = 'BHC' AND isbn = '975-01'; SELECT 'islem icinde' AS an, sube_kodu, adet FROM stok ORDER BY sube_kodu; ROLLBACK; SELECT 'geri alindiktan sonra' AS an, sube_kodu, adet FROM stok ORDER BY sube_kodu; SQL
┌──────────────┬───────────┬──────┐ │ an │ sube_kodu │ adet │ ├──────────────┼───────────┼──────┤ │ islem icinde │ BHC │ 2 │ │ islem icinde │ MRK │ 2 │ └──────────────┴───────────┴──────┘ ┌───────────────────────┬───────────┬──────┐ │ an │ sube_kodu │ adet │ ├───────────────────────┼───────────┼──────┤ │ geri alindiktan sonra │ BHC │ 1 │ │ geri alindiktan sonra │ MRK │ 3 │ └───────────────────────┴───────────┴──────┘
İşlemin içinde iki güncelleme de görünür; geri alma sonrasında ikisi de yoktur. Atomiklik yalnız hata durumu için değildir — geri alma, uygulamanın bilerek verdiği bir karar da olabilir. Kursun ilk dersindeki dosya örneğinde bu düzenek yoktu: yarım kalan yazma dosyada yarım kalıyordu.
Tutarlılık
Tutarlılık (consistency), işlemin veritabanını bir geçerli durumdan başka bir geçerli duruma taşımasını ister. “Geçerli” olan, şemadaki kısıtların tümünün sağlandığı durumdur. İşlemin ortasında kısıt geçici olarak bozulabilir; işlem sonunda bozuk kalamaz.
rm -f kutuphane.db sqlite3 kutuphane.db <<'SQL' CREATE TABLE stok (sube_kodu TEXT NOT NULL, isbn TEXT NOT NULL, adet INTEGER NOT NULL, PRIMARY KEY (sube_kodu, isbn), CHECK (adet >= 0)); INSERT INTO stok VALUES ('MRK', '975-01', 3), ('BHC', '975-01', 1); SQL sqlite3 kutuphane.db <<'SQL' .bail on BEGIN; UPDATE stok SET adet = adet - 1 WHERE sube_kodu = 'BHC' AND isbn = '975-01'; UPDATE stok SET adet = adet - 1 WHERE sube_kodu = 'BHC' AND isbn = '975-01'; COMMIT; SQL sqlite3 kutuphane.db <<'SQL' .headers on .mode box SELECT sube_kodu, adet FROM stok ORDER BY sube_kodu; SQL
Runtime error near line 4: CHECK constraint failed: adet >= 0 (19) ┌───────────┬──────┐ │ sube_kodu │ adet │ ├───────────┼──────┤ │ BHC │ 1 │ │ MRK │ 3 │ └───────────┴──────┘
İkinci güncelleme adedi eksiye düşüreceği için reddedildi; birincisi de geri alındı ve adet başlangıçtaki bire döndü.
Bu sonucun bir koşulu vardır ve gözden kaçar. Bloktaki ilk satır, istemciye ilk hatada
durmasını söyler; adı ve yazılışı motora ve araca göre değişir. O satır olmasaydı istemci
hatayı yok sayıp COMMIT gönderir ve yalnız birinci güncellemenin uygulandığı yarım
bir iş kalıcı olurdu. Tutarlılık güvencesi motorun kısıtları uygulamasıyla başlar ama
istemcinin hata karşısında doğru davranmasıyla tamamlanır. Hatayı yutan bir istemci,
motorun verdiği güvenceyi elinden alır.
Yalıtım
Yalıtım (isolation), aynı anda çalışan işlemlerin birbirinin yarım durumunu görmemesini ister. En katı yorumu şudur: eşzamanlı çalışan işlemlerin sonucu, aynı işlemlerin bir sırayla teker teker çalıştırılmasından elde edilebilecek bir sonuçla aynı olmalıdır.
Bu güvence pahalıdır ve çoğu sistem onu tümüyle uygulamak yerine kademelendirir. Gevşetme belirli anormallikleri serbest bırakır ve bunların adları vardır: bir işlemin başka bir işlemin onaylanmamış yazmasını görmesi, aynı satırın iki okumada farklı değer vermesi, bir koşula uyan satır kümesinin iki okumada farklı olması. Hangi kademede hangi anormalliğin görülebileceği, kilitleme ile sürüm tabanlı yaklaşımların farkı ve kilitlenme durumları bu müfredatın ilerleyen kurslarına aittir. Burada tanım düzeyinde bırakılıyor: kursun ilk dersindeki kayıp güncelleme, yalıtımın bulunmadığı bir ortamda ne olduğunun örneğiydi.
Kalıcılık
Kalıcılık (durability), onaylanmış bir işlemin sonucunun kalıcı olmasını ister — sistem hemen ardından çökse bile. Onay bildirimi bir sözdür: veri artık kalıcı depolamada güvencededir.
rm -f kutuphane.db sqlite3 kutuphane.db <<'SQL' CREATE TABLE odunc (odunc_no INTEGER PRIMARY KEY, uye_no INTEGER NOT NULL); BEGIN; INSERT INTO odunc VALUES (1001, 41); COMMIT; BEGIN; INSERT INTO odunc VALUES (1002, 52); ROLLBACK; SQL sqlite3 kutuphane.db <<'SQL' .headers on .mode box SELECT odunc_no, uye_no FROM odunc; SQL
┌──────────┬────────┐ │ odunc_no │ uye_no │ ├──────────┼────────┤ │ 1001 │ 41 │ └──────────┴────────┘
İkinci çağrı ayrı bir süreçtir; veriyi yazan sürecin belleğinden hiçbir şey devralmaz. Onaylanan satırı görür, geri alınan satırı görmez. Ölçüt işlemin sınırıdır: onaydan önce yazılan hiçbir şey kalıcı sayılmaz, onaydan sonra yazılan her şey sayılır.
Kalıcılığın gerçekleştirimi genellikle bir kütüğe dayanır: değişiklikler veri sayfalarına uygulanmadan önce ardışık bir yazma öncesi günlükne (write-ahead log) yazılır ve o yazma disk üzerinde güvenceye alınır. Çökme sonrası açılışta kütük okunur; onaylanmış ama sayfalara işlenmemiş değişiklikler tamamlanır, onaylanmamış olanlar geri alınır. Kütük biçimi, adı ve diske yazmanın hangi noktada güvenceye alındığı motora göre değişir; bazı motorlarda bu davranış ayarlanabilir ve gevşetildiğinde kalıcılık güvencesi de gevşer.
Bedeli ve Sınırları
Dört güvence bedava değildir. Atomiklik ve kalıcılık ek yazma gerektirir; yalıtım ya kilit ya da sürüm saklama gerektirir. İşlemi gereğinden uzun tutmak, ne kadar veriyi ne kadar süre kilitlediğini büyütür — kullanıcı girdisi bekleyen bir işlem yaygın bir tasarım hatasıdır.
İki sınır da belirtilmelidir. Birincisi, ACID tek bir veritabanı içindir; iki ayrı sistemi kapsayan bir iş için aynı güvence kendiliğinden gelmez. İkincisi, tutarlılık sözü şemada yazılı kısıtlarla sınırlıdır. Şemaya yazılmamış bir iş kuralı, onaylanmış bir işlem sonunda bozulmuş olabilir ve motor bunu bilmez. Bütünlük Kısıtları dersindeki “kuralı şemaya yaz” ilkesinin buradaki karşılığı budur.
Özet
- İşlem, tek bir birim gibi ele alınan deyimler dizisidir; sınırı onaylama ya da geri alma ile belirlenir.
- Atomiklik ara durumun kalıcı olmamasını, tutarlılık işlem sonunda bütün kısıtların sağlanmasını ister.
- Motorun kısıtı reddetmesi tek başına yetmez; hatayı yok sayıp onay gönderen bir istemci yarım işi kalıcı kılar.
- Yalıtım, eşzamanlı işlemlerin birbirinin yarım durumunu görmemesidir; kademeleri ve gerçekleştirimi ayrı bir kursun konusudur.
- Kalıcılık onay anına bağlıdır ve genellikle yazma öncesi günlükyle sağlanır; güvencenin ne kadar sıkı olduğu motora göre değişir ve ayarlanabilir.
Sonraki Adım
Bu ders ilişkisel veritabanının verdiği sözleri tam olarak adlandırdı. Aynı adlandırma, bir karşılaştırmayı da mümkün kılar: bu sözlerin bir bölümünden vazgeçen sistemler vardır ve karşılığında başka şeyler sunarlar. Kursun son dersi bu seçimi ele alır — hangi veri ve hangi erişim biçimi ilişkisel modeli gerektirir, hangi durumda başka bir veri modeli daha uygun olur, ve bu karar hangi ölçütlerle verilir?
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.