Çok kullanıcılı veritabanlarının ortaya çıkmasıyla birlikte, aynı verilerin eşzamanlı olarak değiştirilmesini sınırlama ihtiyacı doğdu. Bu, paralel değişiklikleri önleyen ve veri bütünlüğünü korumaya yardımcı olan çeşitli kilit yönetim mekanizmalarının ortaya çıkmasına yol açtı.
Erişim kontrolü olmadan, eşzamanlı işlemler verilerin bozulmasına veya kaybına neden olabilir: örneğin, iki işlem aynı anda bir satırı güncelleyebilir ve birinin değişiklikleri kaybolabilir. Yetersiz kilitler, yarış koşullarına (race conditions) yol açabilirken, aşırı kilitler performans kaybına (deadlocks, contention) neden olur.
Modern veritabanı yönetim sistemlerinde kilit seviyeleri (satır düzeyi, sayfa düzeyi, tablo düzeyi) ve farklı modlar (paylaşımlı, özel, güncelleme) bulunmaktadır. Programcı, bu ayarları işlem izolasyonu ve açık kilitleme komutları (örneğin, SELECT ... FOR UPDATE) aracılığıyla yönetebilir.
Kod örneği:
-- İşlem tamamlanana kadar satırı kilitle BEGIN TRANSACTION; SELECT * FROM users WHERE id = 1 FOR UPDATE; UPDATE users SET name = 'Yeni İsim' WHERE id = 1; COMMIT;
Anahtar özellikler:
Paylaşımlı kilit (shared lock) ile özel kilit (exclusive lock) arasındaki fark nedir?
Paylaşımlı kilit, birden fazla işlemin verileri aynı anda okumasına izin verir, ancak değiştirmesine izin vermez. Özel kilit, yalnızca bir işlem verileri değiştirmesine izin verir, diğer tüm işlemler için erişim engellenir.
SELECT komutu bir kilit oluşturabilir mi?
Genellikle SELECT kilit oluşturmaz, ancak SELECT ... FOR UPDATE kullanılırsa veya yüksek bir izolasyon seviyesi (örneğin, SERIALIZABLE) varsa, veritabanı satırları kilitleyebilir.
Kod örneği:
SELECT * FROM products WHERE id = 10 FOR UPDATE;
Kilitler her zaman "kaybolan güncellemelerden" korur mu?
Hayır, kilit veya izolasyon seviyesi yanlış seçilirse, bir işlemin değişiklikleri diğerinin yüzünden kaybolur; bu duruma "kaybolan güncelleme" denir. Rekabet yönetim mekanizmaları dikkatlice seçilmelidir.
Analitik departmanında iki program aynı anda sipariş durumlarını güncelliyor. Hızlandırmak için bilinçli olarak READ UNCOMMITTED seviyesi ayarlandı, böylece satırlar kilitlenmiyor. Bu, çakışmalara ve "kaybolan" güncellemelere yol açtı, bazı veriler zarar gördü.
Artılar:
Eksiler:
Satış departmanında kritik yerler TRANSACTION + SELECT ... FOR UPDATE ile sarıldı. Okuma ve güncelleme işlemlerini satır düzeyinde ayrıştırdılar.
Artılar:
Eksiler: