ProgramlamaBackend geliştirici

SQL'de verilere eşzamanlı erişimi sınırlamak için doğru bir şekilde nasıl uygulama yapılır (kilit mekanizmaları, kilit seviyeleri ve bunların yönetim yolları)?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Soru Tarihi

Ç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ı.

Problem

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.

Çözüm

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:

  • Kilit granülerliği (satır, sayfa, tablo)
  • Açık ve örtük kilitler (işlemler ve özel talimatlar aracılığıyla)
  • İzolasyon seviyesinin kilit şemasına etkisi

Yanıltıcı Sorular.

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.

Tipik Hatalar ve Antipatternler

  • İzolasyon seviyesinin yanlış seçilmesi (çok düşük veya çok yüksek)
  • Kritik sorgularda yeterince açık kilit olmaması
  • Küresel (tablo düzeyi) kilitlerin kötüye kullanımı, performans kaybına yol açar
  • Tamamlanmamış işlemler nedeniyle kilitlerin serbest bırakılmaması

Hayat Örneği

Olumsuz Durum

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:

  • Başlangıçta iyi hız

Eksiler:

  • Anahtar verilerin kaybı/zarar görmesi
  • Kurtarma zorlukları

Olumlu Durum

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:

  • Veri bütünlüğünün garantisi
  • Kayıp ve değişikliklerin tekrarı yok

Eksiler:

  • Bazen güncellemeler biraz daha uzun sürebilir (kilitlerden dolayı)