Veritabanı İşlemi (Transaction): Ya Hep Birlikte Ya Hiç
Transaction, birden çok veritabanı adımını ya hep birlikte ya hiç uygulanmayacak tek bir işlem yapar. COMMIT, ROLLBACK ve ACID kavramları, örnekle.
Veritabanı işlemi (transaction) nedir?
Veritabanı işlemi (transaction), birbirine bağlı bir dizi veritabanı adımını tek bir bölünmez iş olarak ele alan mekanizmadır. İşlemin içindeki tüm adımlar başarıyla tamamlanırsa değişiklikler kalıcı olur (COMMIT); herhangi biri başarısız olursa o ana kadar yapılan her şey geri alınır (ROLLBACK). Yani sonuç ya hep birlikte uygulanır ya hiç uygulanmaz.
Bu mantığın günlük hayattaki karşılığı bir havale işlemidir: bir hesaptan para düşülürken diğerine eklenmelidir. Bir adım yapılıp diğeri hata verirse para ortadan kaybolmuş olur. Transaction, bu adımları birbirinden ayrılmaz kılarak böyle tutarsızlıkları önler.
ACID özellikleri nelerdir?
İşlemlerin güvenilirliği, ACID kısaltmasıyla özetlenen özelliklere dayanır:
- Bölünmezlik (Atomicity): İşlem ya tamamen uygulanır ya hiç uygulanmaz.
- Tutarlılık (Consistency): İşlem veritabanını bir geçerli durumdan başka bir geçerli duruma taşır; tanımlı kısıtlar ve kurallar ihlal edilmez.
- Yalıtım (Isolation): Aynı anda çalışan işlemler birbirinin yarım kalmış değişikliğini görmeyecek şekilde ayrıştırılır.
- Kalıcılık (Durability): COMMIT edilen değişiklik, sistem çökse bile kaybolmaz.
Bu özellikler ilişkisel veritabanlarının çoğunun temel vaadidir; bazı dağıtık ve NoSQL sistemlerde daha gevşek garantiler tercih edilebilir, bu yüzden kullanılan ürünün sunduğu garantiyi bilmek gerekir.
Nasıl çalışır? COMMIT ve ROLLBACK
Bir işlem BEGIN (bazı ürünlerde START TRANSACTION) ile başlar. Sonrasındaki komutlar henüz kalıcı değildir, yalnızca bu işlemin içinde görünür. İşlem COMMIT ile bitirilirse değişiklikler kalıcı hale gelir ve diğer oturumlara görünür olur. ROLLBACK ile bitirilirse hiçbir şey olmamış gibi eski duruma dönülür.
Çoğu veritabanı, işlem açılmadıkça her komutu kendi başına bir işlem sayar ve hemen kaydeder (otomatik commit). Yani tek bir UPDATE bile bir işlemdir. Birden çok komutun birlikte güvence altına alınması istendiğinde ise işlem açıkça başlatılır. İşlem içinde ara noktalar (SAVEPOINT) tanımlanıp yalnızca bir bölümü geri almak da mümkündür.
Küçük bir örnek: hesaplar arası havale
Havale için birbirine bağlı güncellemeler gerekir: gönderenin bakiyesi azalır, alıcınınki artar. Bunlar tek işlemde yazılır:
BEGIN; UPDATE accounts SET balance = balance - :amount WHERE id = :from_id; UPDATE accounts SET balance = balance + :amount WHERE id = :to_id; COMMIT;
Uygulama, ilk güncellemeden sonra bir hata alırsa COMMIT yerine ROLLBACK çağırır ve bakiyeler eski haline döner. Kodda genellikle bir hata yakalama yapısı kullanılır: hata yoksa commit, hata varsa rollback.
İşlem içinde bakiyenin eksiye düşmemesi gibi bir kural varsa, bu kural bir CHECK kısıtı ile veritabanında da güvence altına alınabilir; kural ihlal edildiğinde komut hata verir ve işlem geri alınır.
Yalıtım seviyeleri ve eşzamanlılık
Birden çok kullanıcı aynı anda çalıştığında hangi işlemin hangisinin değişikliğini ne zaman göreceği yalıtım seviyesiyle belirlenir. SQL standardı ve veritabanı ürünleri; Read Uncommitted, Read Committed, Repeatable Read ve Serializable gibi seviyeler sunar. Seviye yükseldikçe tutarlılık artar, eşzamanlılık ve hız ise genellikle azalır.
Yalıtım yetersizse şu sorunlar ortaya çıkabilir:
- Kirli okuma (dirty read): Henüz onaylanmamış bir değişikliği okumak.
- Tekrarlanamayan okuma: Aynı satırı yeniden okuyup farklı değer görmek.
- Hayalet okuma: Aynı sorguyu tekrar edince yeni satırların belirmesi.
Hangi seviyenin hangi sorunu önlediği veritabanı ürününe göre farklılık gösterir; ürünün belgesine bakmak gerekir.
Riskler ve sık yapılan hatalar
- Uzun süren işlemler: Açık işlem, dokunduğu satırları kilitleyebilir. Kullanıcı girişi beklerken işlem açık tutmak diğer oturumları bloke eder.
- Kilitlenme (deadlock): Farklı işlemler birbirinin tuttuğu kaynağı beklerse veritabanı birini sonlandırır. Güncelleme sırasını tutarlı yapmak ve işlemleri kısa tutmak riski azaltır.
- COMMIT'i unutmak: Açık bırakılan işlem değişiklikleri görünmez tutar ve kaynakları bağlı bırakır.
- Hata yönetimini atlamak: Rollback çağrılmazsa bağlantı havuzuna kirli bir işlem geri dönebilir.
- Her şeyi tek işleme sıkıştırmak: Birbirinden bağımsız adımları tek işleme koymak gereksiz kilit ve geri alma maliyeti yaratır.
- Dış sistemleri işlemin içine dahil sanmak: E-posta göndermek ya da başka bir servise çağrı yapmak rollback ile geri alınamaz.
Hangi rol ve ekipler için önemli?
Transaction bilgisi yazılım geliştiriciler, veritabanı yöneticileri ve veri mühendisleri için temel yetkinliktir; veri analistleri ise raporların neden bazen "yarım" veri gösterebildiğini anlamak için bilmelidir. Mindset'in SQL ile Programlama Eğitimi, veri işleme dili modülüyle INSERT, UPDATE ve DELETE komutlarını işler; SQL ile Veri Sorgulama (İleri) eğitimi görünümler, saklı yordamlar ve tetikleyiciler modülüyle işlem mantığının uygulandığı yapılara değinir.
PostgreSQL ile Veri Analizi eğitiminin PL/pgSQL modülü, işlem içeren programatik kodlama için uygundur. Kurumsal ekiplerde ödeme, stok ya da sipariş gibi tutarlılığın kritik olduğu sistemlerde işlem sınırlarının belirlenmesi, geliştirici ve veritabanı yöneticisinin birlikte aldığı bir karardır.
İlgili Mindset programı
SQL ile Programlama Eğitimi
Sık sorulan sorular
Transaction ile tetikleyici (trigger) birbirine nasıl bağlanır?
Tetikleyici, tetiklendiği komutla aynı işlemin içinde çalışır. Tetikleyicide bir hata oluşursa ana komut da geri alınır. Yani işlemin bölünmezlik garantisi tetikleyicinin yaptığı değişiklikleri de kapsar. Bu nedenle tetikleyiciyi hızlı ve hataya dayanıklı yazmak, işlem süresini ve kilit riskini doğrudan etkiler.
Otomatik commit nedir, kapatmalı mıyım?
Otomatik commit açıkken her komut bitince hemen kalıcı hale gelir. Birden çok komutun birlikte başarılı olması gerekiyorsa işlemi açıkça başlatırsınız; otomatik commit o süre boyunca devre dışı kalır. Genel olarak ayarı kapatmak yerine işlem sınırlarını koda açıkça yazmak daha okunabilir ve güvenlidir.
NoSQL veritabanlarında transaction var mı?
Ürüne bağlıdır. Bazı belge ve anahtar-değer veritabanları tek kayıt düzeyinde garanti verir, bazıları birden çok kayıt için de işlem destekler, bazıları ise ödünleşimli tutarlılık modeli kullanır. Kritik tutarlılık gereken bir uygulamada seçilen sistemin işlem desteği ve sınırları belgesinden mutlaka doğrulanmalıdır.
Uygulama kodunda transaction'ı kim yönetir?
Genellikle uygulama katmanı işlem sınırını belirler: veri erişim kütüphanesi ya da çatı, bir iş birimi başladığında işlemi açar, sonunda commit veya hata durumunda rollback yapar. Veritabanı içinde saklı yordamlar da kendi işlemlerini yönetebilir. Sınırı tek bir yerde tutmak, hata ayıklamayı kolaylaştırır.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası, Yazılım Geliştirme