Middle
Veritabanlarıyla çalışma bağlamında kilitler nedir ve neden gereklidirler?
sobes.tech yapay zeka
AI'dan gelen yanıt
Veritabanı kilitleri, birden çok kullanıcının veya işlemin aynı verilere aynı anda erişimini yönetmek için kullanılan mekanizmalardır. Çakışmaları önler ve rekabet ortamında veri bütünlüğünü korur.
Aşağıdaki sorunları çözmek için gereklidirler:
- Yarış Durumları (Race Conditions): İşlemlerin sırasının son sonucu etkilediği durum. Kilitler, işlemlerin sıralı veya veri için güvenli bir sırayla gerçekleştirilmesini sağlar.
- Tutarsız Okumalar (Inconsistent Reads): Bir işlem veriyi okurken başka bir işlem onu değiştirir, bu da ara veya eksik bir veri durumu ile sonuçlanabilir. Kilitler bunu önleyebilir.
- Kayıp Güncellemeler (Lost Updates): İki işlem aynı veriyi okur, değiştirir ve kaydeder. Son kaydetme, ilk işlemin değişikliklerini üzerine yazar ve kaybeder. Kilitler, değişikliklerin kaybolmasını önlemeye yardımcı olur.
- Hayalet Okumalar (Phantom Reads): Aynı işlem içinde, tekrar eden sorgu, başka bir işlemin eklediği veya sildiği satırlar nedeniyle farklı bir satır kümesi döndürür.
Ana kilit türleri:
- Paylaşılan (Shared/Read Lock): Birden çok işlem aynı veriyi eşzamanlı okuyabilir. Aynı veriye yazma kilidi izin verilmez.
- Özel (Exclusive/Write Lock): Veriye tek başına erişim sağlar. Sadece bir işlem belirli verilere özel kilit alabilir. Aynı anda okuma veya yazma kilidi verilemez.
Kilitler farklı seviyelerde uygulanabilir:
- Veritabanı seviyesi: Tüm veritabanı kilitlenir. Nadiren kullanılır.
- Tablo seviyesi: Tüm tablo kilitlenir. Daha az detaylı, eşzamanlılığı azaltabilir.
- Satır seviyesi: Belirli bir satır kilitlenir. Daha detaylı, yüksek eşzamanlılık sağlar, ancak daha fazla kaynak gerektirebilir.
- Sayfa seviyesi: Bir veri sayfası (birden çok satır içeren depolama birimi) kilitlenir. Tablonun tamamını veya satırı kilitlemek arasında bir uzlaşmadır.
Kilitlerin uygulanması, kullanılan SGBD'ye bağlıdır (örneğin, InnoDB ve MyISAM MySQL'de farklı stratejilere sahiptir, PostgreSQL vb.). PHP'de genellikle kilitleri yönetmek için işlemler kullanılır.
-- SQL'de işlem ve kilit kullanımı örneği
START TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- FOR UPDATE, seçilen satıra özel kilit uygular
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
COMMIT;
-- Hata durumunda ROLLBACK yapılır