İçeriğe geç
Yeni yazı çıkınca e-posta · 4.812 abone 190 rehber · 78 ipucu · 58 komut RSS GitHub LinkedIn İletişim
Ara Ctrl K Bültene katıl
Tüm arşiv · 190 rehber →
Tüm araçlar · 75 üreteç →
Veritabanı

Transaction ve ACID nedir? Veritabanının verdiği dört söz

Atomiklik, tutarlılık, yalıtım ve kalıcılık; yalıtım düzeylerinin farkı, kilitlenme ve uzun işlemin neden zarar verdiği.

Mustafa Çelik 25 Ağustos 2026 · 5 dk okuma

Bir hesaptan para çıkıp diğerine girerken sistem çökerse ne olur? Para havada mı kalır? Veritabanlarının işlem (transaction) kavramı tam olarak bu soruyu yanıtlamak için vardır ve verdiği söz dört harfle özetlenir.

İşlem nedir

İşlem, birlikte başarılı olması ya da birlikte başarısız olması gereken bir grup değişikliktir.

Başlatılır, içinde birkaç işlem yapılır ve sonunda ya onaylanır — hepsi kalıcı olur — ya da geri alınır — hiçbiri olmamış gibi davranılır.

Aradaki durum yoktur. Bu “ya hep ya hiç” garantisi, para transferi gibi çok adımlı işlemlerin güvenle yazılmasını sağlayan şeydir.

Atomiklik

Dört sözün ilki budur: bir işlemin parçaları bölünmez.

Üç UPDATE içeren bir işlemde ikincisi başarısız olursa, birincisi de geri alınır. Sistem elektrik kesintisiyle çökse bile, açılışta yarım kalan işlemler geri alınır.

Bu, uygulama kodunda telafi mantığı yazma yükünü ortadan kaldırır — veritabanı bunu üstlenir.

Tutarlılık

İşlem, veritabanını geçerli bir durumdan başka bir geçerli duruma taşır.

Buradaki “geçerli”, tanımladığınız kuralların korunması demektir: yabancı anahtar ilişkileri, benzersizlik kısıtları, denetim kuralları. Bir işlem bu kuralları bozacaksa reddedilir.

Kısıtları uygulama katmanında değil veritabanında tanımlamanın nedeni budur: uygulama unutabilir, veritabanı unutmaz.

Yalıtım

En karmaşık ve en çok soru çıkaran özellik budur. Eşzamanlı çalışan işlemler birbirini ne kadar görecek?

Tam yalıtım, işlemlerin sanki sırayla çalışıyormuş gibi davranması demektir. Ama bu pahalıdır ve eşzamanlılığı düşürür. Bu yüzden veritabanları yalıtım düzeyleri sunar.

Read Committed: yalnızca onaylanmış veri okunur. Çoğu veritabanının öntanımlısıdır. Aynı sorguyu iki kez çalıştırırsanız farklı sonuç alabilirsiniz — arada başkası onaylamıştır.

Repeatable Read: işlem boyunca okuduğunuz satırlar değişmez.

Serializable: en katı düzey; işlemler gerçekten sırayla çalışmış gibi davranır.

Düşük düzeylerde görülen anormallikler adlandırılmıştır: kirli okuma, tekrarlanamayan okuma ve hayalet satırlar. Hangisinin kabul edilebilir olduğu uygulamaya bağlıdır — bir raporlama sorgusu ile bir stok düşme işlemi aynı düzeyi gerektirmez.

Kalıcılık

Onaylanan bir işlem, sistem hemen çökse bile kaybolmaz.

Bunu sağlayan şey önce günlüğe yazma ilkesidir: değişiklik asıl veri dosyalarına yazılmadan önce bir işlem günlüğüne kaydedilir. Çökme sonrası açılışta bu günlük okunur ve yarım kalanlar tamamlanır ya da geri alınır.

Bu, veritabanı yedeklemesinde dosya kopyalamanın neden yetmediğini de açıklar: veri dosyaları o an tutarsız olabilir, tutarlılık günlükle birlikte anlam kazanır. Ayrıntısı veritabanı: dosya kopyalamak yetmez rehberinde.

İşlem günlüğü aynı zamanda kurtarma noktalarının temelidir; SQL Server tarafındaki zincir mantığı SQL Server yedek zinciri rehberinde.

Kilitler ve kilitlenme

Yalıtım genelde kilitlerle sağlanır: bir işlem satırı değiştirirken başkasının aynı satıra dokunmasını engeller.

Buradan iki sorun doğar.

Bekleme: bir işlem uzun sürerse, aynı satırı isteyen diğerleri bekler. Uygulama tarafında bu, açıklanamayan yavaşlık olarak görünür.

Kilitlenme (deadlock): iki işlem karşılıklı olarak birbirinin tuttuğu kaynağı bekler. Veritabanı bunu algılar ve birini iptal eder.

Kilitlenmeyi azaltmanın en pratik yolu, kaynaklara hep aynı sırada erişmektir. İki işlem de önce A sonra B tablosuna dokunursa döngü oluşmaz.

Uzun işlemler zarar verir

Bir işlemi açık tutmak masum görünür ama pahalıdır.

Kilitler işlem boyunca tutulur — diğerleri bekler. Ayrıca eski satır sürümleri temizlenemez; PostgreSQL’de bu doğrudan şişmeye yol açar ve PostgreSQL vacuum ve şişme rehberinde ele alınıyor.

Klasik hata, bir işlemin içinde dış bir servise çağrı yapmaktır. O çağrı yavaşlarsa veritabanı işlemi de o kadar açık kalır. Kural basittir: işlemler kısa olmalı ve içinde ağ beklemesi bulunmamalıdır.

NoSQL ve dağıtık sistemler

Bazı NoSQL sistemleri ACID yerine daha gevşek garantiler sunar — genelde “sonunda tutarlı” modelini benimserler.

Bunun nedeni dağıtık sistemlerdeki temel takastır: ağ bölünmesi yaşandığında ya tutarlılıktan ya erişilebilirlikten ödün vermek gerekir.

Bugün çizgi bulanıklaşmıştır; birçok NoSQL veritabanı belge düzeyinde ya da sınırlı kapsamda işlem desteği ekledi. Yine de seçim yaparken hangi garantinin verildiğini okumak gerekir. Karşılaştırma SQL ve NoSQL farkı yazısında.

Kısaca

İşlem, birlikte başarılı ya da birlikte başarısız olan bir değişiklikler grubudur. ACID bunun dört sözüdür: bölünmezlik, kural koruma, eşzamanlılık yalıtımı ve çökmeye dayanıklılık.

Pratikte iki şey önemlidir: uygulamanızın hangi yalıtım düzeyine ihtiyacı olduğunu bilmek, ve işlemleri kısa tutmak. Uzun işlemler yalnızca kendilerini değil, tüm sistemi yavaşlatır.

Mustafa Çelik

Altyapı ve Operasyon Müdürü, İstanbul. 25 yıldır BT altyapısı, sistem yönetimi ve ağ altyapısıyla uğraşıyor; öğrendiklerini bu blogda üretim ortamında denenmiş rehberlere çeviriyor.

Hakkımda

Bu rehber işinize yaradıysa, sonrakini kaçırmayın.

Yeni yazı yayınlandığında tek e-posta. Takvim yok, dilediğiniz an çıkabilirsiniz.

Bülten sağlayıcısı henüz bağlanmadı. Bağlanana kadar e-posta ile yazabilirsiniz ya da RSS akışını takip edebilirsiniz.