Transaction Nedir?
Bir transaction, tek bir işlem gibi davranan bir grup operasyondur. Tüm operasyonlar başarıyla tamamlanır ya da hiçbiri tamamlanmaz. Bu, veritabanının tutarlılığını korumanın temelidir.
Birden fazla istemci aynı arabellek (buffer) üzerinde eş zamanlı işlem yaptığında ciddi sorunlar ortaya çıkabilir: bir istemci tutarsız değerler görebilir ya da iki istemci birbirinin yazdığı değerlerin üzerine yazabilir. Veritabanı sistemi bu kaos ortamını iki temel bileşenle düzenler:
⚡ Recovery Manager
- Log dosyasını okur ve yazar
- Atomicity ve Durability'yi güvence altına alır
- Sistem çökmelerinden sonra veritabanını kurtarır
🔒 Concurrency Manager
- Transaction'ların çalışmasını düzenler
- Isolation'ı sağlar
- Eş zamanlı erişimi kontrol eder
Klasik Örnek: Para Transferi ($50)
A hesabından B hesabına 50 dolar transfer eden bir transaction şu adımlardan oluşur:
| Adım | Operasyon | Türü | Açıklama |
|---|---|---|---|
| 1 | read(A) | Okuma | A'nın değerini diskten belleğe al |
| 2 | A := A – 50 | Hesaplama | Bellekteki A değerini güncelle |
| 3 | write(A) | Yazma | Güncellenmiş A'yı diske yaz |
| 4 | read(B) | Okuma | B'nin değerini diskten belleğe al |
| 5 | B := B + 50 | Hesaplama | Bellekteki B değerini güncelle |
| 6 | write(B) | Yazma | Güncellenmiş B'yi diske yaz |
Kritik Sorun: Sistem 3. adımdan sonra, 6. adımdan önce çökerse A'dan 50 TL çıkmış ama B'ye eklenmemiş olur. Para "kaybolur"! İşte ACID özellikleri tam olarak bu tür durumları önlemek için tasarlanmıştır.
ACID Özellikleri
Veritabanı sistemlerinin veri bütünlüğünü korumak için sağlaması gereken dört temel özelliktir. Her özellik, farklı bir sorun türüne karşı koruma sağlar.
A
"Ya hepsi ya hiçbiri" ilkesi. Tüm operasyonlar başarılı olur (commit) veya hepsi geri alınır (rollback). Kısmi sonuç kabul edilmez.
C
Her transaction veritabanını tutarlı bir durumdan başka bir tutarlı duruma taşır. A+B toplamı transaction öncesi ve sonrası aynı kalır.
I
Transaction'lar birbirinden izole çalışır. Bir transaction, diğerinin kısmen tamamlanmış sonuçlarını görmemeli. Sanki sistemde tek transaction var gibi davranır.
D
Commit edilen bir transaction'ın değişiklikleri kalıcıdır. Yazılım veya donanım arızası olsa bile sonuçlar korunur.
Isolation Problemi: Görsel Örnek
T1 transaction'ı çalışırken T2 araya girerse tutarsız veri okur:
Çözüm: Isolation, transaction'ları seri (biri bittikten sonra diğeri) çalıştırarak garantilenebilir. Ancak bu performansı düşürür. Modern sistemler eş zamanlılığı izole kalarak sağlamak için kilitleme (locking) mekanizmaları kullanır.
Recovery Manager
Recovery Manager, Atomicity ve Durability'den sorumlu olan sunucu bileşenidir. Log dosyasını okur ve işler. Üç temel görevi vardır:
Sistem Kurtarma Mantığı
⟲ Geri Alınacaklar (UNDO)
- Tamamlanmamış transaction'ların değişiklikleri
- Log'da COMMIT veya ROLLBACK kaydı olmayan transaction'lar
- Kısmen yazılmış, tutarsız veriler
⟳ Yeniden Uygulanacaklar (REDO)
- Commit edilmiş transaction'ların değişiklikleri
- Log'da COMMIT kaydı olan transaction'lar
- Belleğe yazılmış ama diske flushed edilmemiş olabilenler
Log Kayıt Türleri
Recovery Manager beş tür log kaydı yazar. Her kayıt, transaction'ın hangi aşamada olduğunu belgeler.
Update Kayıtlarının Yapısı
SETINT ve SETSTRING kayıtları, temel iki alana (tür + tx ID) ek olarak 5 değer daha içerir:
Rollback Algoritması
Recovery Manager, bir transaction'ı geri almak için log dosyasını geriye doğru okur:
- 1. Mevcut kaydı en son log kaydına ayarla
- 2. Mevcut kayıt T'nin başlangıç kaydı olana kadar devam et:
- a) Eğer mevcut kayıt T'nin update kaydıysa → eski değeri belirtilen konuma geri yaz
- b) Önceki log kaydına geç
- 3. Log dosyasına bir ROLLBACK kaydı ekle
Recovery Algoritmaları
Üç farklı recovery algoritması vardır. Her biri farklı bir strateji kullanır ve farklı trade-off'ları vardır.
- Her log kaydı için (sondan başa doğru okunarak):
- a) Eğer COMMIT kaydıysa → o transaction'ı "tamamlanmış listesi"ne ekle
- b) Eğer ROLLBACK kaydıysa → o transaction'ı "geri alınmış listesi"ne ekle
- c) Eğer UPDATE kaydıysa ve transaction tamamlanmış/geri alınmış değilse → eski değeri geri yaz (UNDO)
- Her log kaydı için (baştan sona doğru okunarak):
- Eğer UPDATE kaydıysa ve transaction tamamlanmış listedeyse → yeni değeri tekrar yaz (REDO)
🔄 Undo-Only
- Sadece geri alma yapar
- Commit sonrası değişiklikler diske yazılır
- Crash sonrası redo gerekmez
- Buffer flush maliyeti yüksek
⏩ Redo-Only
- Sadece ileriye alma yapar
- Commit öncesi değişiklikler diske yazılmaz
- Crash sonrası undo gerekmez
- Log boyutu büyük olabilir
Write-Ahead Logging (WAL)
Undo-Redo algoritması, tamamlanmamış bir transaction'ın tüm update kayıtlarının log dosyasında bulunduğunu varsayar. Ancak sistem çökmesi her an gerçekleşebilir. Bu durumda ne olur?
Dört Olası Senaryo
Tamamlanmamış bir transaction bir sayfayı değiştirdiğinde ve eşleşen log kaydı oluşturulduğunda sistem çökerse:
✅ A) Her İkisi de Diske Yazıldı
Recovery algoritması log kaydını bulur ve değişikliği geri alır. Sorun yok.
❌ B) Sadece Sayfa Diske Yazıldı
Recovery algoritması log kaydını bulamaz, değişikliği geri alamaz. Ciddi problem! Veritabanı tutarsız kalır.
⚠️ C) Sadece Log Diske Yazıldı
Recovery algoritması log kaydını bulur, var olmayan değişikliği "geri alır". Zaman kaybı ama hata değil.
✅ D) Hiçbiri Diske Yazılmadı
Recovery algoritması log kaydı bulamaz ama zaten değiştirilecek şey de yok. Sorun yok.
Senaryo B kritik bir sorundur. Bunu önlemek için Write-Ahead Logging (WAL) kuralı uygulanır.
WAL Kuralı: Değiştirilen bir buffer (arabellek) diske yazılmadan önce, o değişikliğe ait tüm update log kayıtları mutlaka önce diske yazılmış olmalıdır. Bu kural, veritabanındaki tüm değişikliklerin her zaman log'da bulunmasını ve dolayısıyla her zaman geri alınabilmesini garanti eder.
Checkpointing
Zamanla log dosyası çok büyük hale gelir. Recovery algoritması, tüm log geçmişini taramak zorunda kalır. Checkpoint kayıtları, algoritmanın daha eski log kayıtlarına bakmasına gerek kalmadığını gösteren işaretçilerdir.
Quiescent Checkpointing
Sistem tüm transaction'ları durdurup bekler, tamamlayıp, sonra checkpoint yazar:
- 1. Yeni transaction kabul etmeyi durdur
- 2. Mevcut transaction'ların bitmesini bekle
- 3. Tüm değiştirilmiş buffer'ları diske yaz (flush)
- 4. Log'a <CHECKPOINT> kaydı ekle ve diske yaz
- 5. Yeni transaction kabul etmeye yeniden başla
Nonquiescent Checkpointing
Sistemi durdurmadan checkpoint alınır. Çalışan transaction'lar kayıt altına alınır:
- 1. Yeni transaction kabul etmeyi geçici olarak durdur
- 2. Hâlâ çalışan transaction'ları T₁, ..., Tₖ olarak belirle
- 3. Tüm değiştirilmiş buffer'ları diske yaz (flush)
- 4. <NQCKPT, T₁, ..., Tₖ> kaydını log'a yaz
- 5. Yeni transaction kabul etmeye yeniden başla
⏸ Quiescent
- Sistem durur, tüm tx biter
- <CHECKPOINT> sonrası hiçbir şey taranmaz
- Basit ama sistem kesintisi var
- Düşük trafik dönemlerinde ideal
▶️ Nonquiescent
- Sistem çalışmaya devam eder
- En erken tx'nin START'ına kadar taranır
- Daha karmaşık ama kesinti yok
- Yüksek trafik ortamları için ideal
Checkpoint Sonrası Kurtarma Örneği
Aşağıdaki senaryoda tf anında sistem çökmüş, en yakın checkpoint tc anında alınmıştır:
Checkpoint öncesi tamamlandı. Değişiklikler zaten diske yazıldı.
Commit edildi ama diske yazılmamış olabilir. Yeniden uygulanır.
Commit edilmedi, kısmen yazılmış. Geri alınır.
Data Item Granularity
Recovery Manager'ın log kayıtlarında kullandığı veri biriminin boyutuna granularity (taneciklilik) denir. Boyut arttıkça daha az kayıt gerekir ama her kayıt daha büyük olur.
| Granularity Seviyesi | Açıklama | Log Kayıt Sayısı | Kayıt Boyutu | Kullanım Yeri |
|---|---|---|---|---|
| Değer (Value) | Tek bir alan değeri | Çok fazla | Çok küçük | Küçük, sık güncellenen veriler |
| Kayıt (Record) | Bir tablo satırı | Orta | Orta | Genel amaçlı |
| Blok/Sayfa (Block) | Bir disk bloğu (genellikle 4KB-16KB) | Az | Büyük | SimpleDB gibi basit sistemler |
| Dosya (File) | Tüm bir dosya | Çok az | Çok büyük | Toplu işlemler, yedekleme |
Trade-off: Büyük granularity → daha az log kaydı, daha büyük kayıtlar. Küçük granularity → daha fazla kayıt, daha ince kontrole sahip geri alma. Recovery Manager'ın bu seçimi performans üzerinde doğrudan etkilidir.
Recovery Manager'ın Tasarım Kararları
Özet: Transaction Yönetiminin Temelleri
Veritabanı bütünlüğü, iyi tasarlanmış transaction yönetimi ile korunur. ACID özellikleri hedefi, Recovery Manager ve WAL mekanizması ise bu hedefe ulaşmanın yoludur.