0Pricing
SQL Academy · Ders

Kilitlenmeler: Tespit ve Önleme

Kilitlenmelerin nasıl oluştuğunu, Postgres'in bunları nasıl tespit ettiğini anlayın ve önleyen kilit sıralama kuralları tasarlayın.

Kilitlenmeler: Tespit ve Önleme, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.

Kilitlenme Nedir

İki işlemin her biri diğerinin istediği bir kilidi tutar — hiçbiri ilerleyemez. Veritabanı döngüyü algılar ve işlemlerden birini iptal eder.

Klasik Bir Kilitlenme

A işlemi 1. satırı, B işlemi 2. satırı kilitler. A, 2. satırı; B ise 1. satırı ister. Sistem kilitlenir.

-- Tx A:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- waiting for B...

-- Tx B:
BEGIN;
UPDATE accounts SET balance = balance - 50 WHERE id = 2;
UPDATE accounts SET balance = balance + 50 WHERE id = 1;
-- waiting for A...

-- ERROR: deadlock detected

PostgreSQL Kilitlenmeleri Algılar

Her deadlock_timeout süresinde (varsayılan 1 saniye) PostgreSQL kilit döngülerini denetler. Bir döngü bulursa işlemlerden birini 40P01 hata koduyla iptal eder.

ERROR:  deadlock detected
DETAIL:  Process 1234 waits for ShareLock on transaction 5678 ...

Kilit Alma Sırası Kuralı

Çözüm: tüm kod yollarında kilitleri her zaman aynı sırayla alın.

-- Always update the lower id first:
UPDATE accounts SET balance = balance - 100 WHERE id = LEAST(:from, :to);
UPDATE accounts SET balance = balance + 100 WHERE id = GREATEST(:from, :to);

Yoğun Erişilen Satır Kilitlenmeleri

Aynı yoğun erişilen satırların hızla güncellenmesi genellikle kilitlenme değil, kilit beklemelerini tetikler. Kuyruk kullanın, yoğun satırı bölümlere ayırın veya güncellemeleri uygulama kodunda serileştirin.

FOR UPDATE Okunan Satırları Kilitler

Daha sonra oluşabilecek sürprizleri önlemek için yazma kilitlerini okuma sırasında alın:

BEGIN;
SELECT * FROM accounts WHERE id IN (1, 2) ORDER BY id FOR UPDATE;
-- both rows locked in id order
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

Kilitli Satırları Atlamak

Kuyruk tabloları için "kullanılabilir herhangi bir satırı al" deseni:

SELECT * FROM jobs
WHERE status = 'pending'
ORDER BY created_at
LIMIT 1
FOR UPDATE SKIP LOCKED;
-- skips rows other workers have locked

NOWAIT

Beklemek yerine hemen başarısız olun:

SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR: could not obtain lock on row in relation "accounts"

Kilitlenmeleri Tanılama

log_lock_waits değerini artırın ve kilitlenme bağlamını günlükte yakalayın. Günlük girdisi her iki işlemi ve bunların sorgularını gösterir.

Uygulamada Yeniden Deneme Döngüsü

Kilitlenmeler kurtarılabilir — iptal edilen işlemi yeniden deneyin:

for (let attempt = 0; attempt < 3; attempt++) {
  try {
    await runTransaction();
    break;
  } catch (e) {
    if (e.code === '40P01') continue;     // deadlock
    throw e;
  }
}

Kilit Kapsamını Küçültme

İşlemleri kısaltın — dokunulan her satır COMMIT edilene kadar kilitli kalır. Bir işlem içinde HTTP çağrıları yapmayın veya uzun süren hesaplamalar gerçekleştirmeyin.

Kilit Tırmanmasını Önlemek için Yabancı Anahtarları Dizine Ekleyin

Bir üst satırı sildiğinizde her alt satır denetlenir. FK dizini yoksa bu işlem tam tablo taraması AND satır kilitleri gerektirir. Her FK sütununu dizine ekleyin.

Özet

Kilitlenmeler gerçekleşir — tasarımınızı bunları en aza indirecek şekilde yapın.

  • Kilitleri tutarlı bir sırayla alın
  • Niyetinizi erkenden belirtmek için FOR UPDATE kullanın
  • Kuyruklar için SKIP LOCKED kullanın
  • Kilitlenme hatalarında yeniden deneyin (40P01)
  • İşlemleri kısa tutun

Hızlı Kontrol

Kilitlenmeleri önlemek için en güvenilir tasarım ilkesi nedir?

Sıkça Sorulan Sorular

“Kilitlenmeler: Tespit ve Önleme” dersi ücretsiz mi?

Evet — “Kilitlenmeler: Tespit ve Önleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.

“Kilitlenmeler: Tespit ve Önleme” dersinde ne öğreneceğim?

Kilitlenmelerin nasıl oluştuğunu, Postgres'in bunları nasıl tespit ettiğini anlayın ve önleyen kilit sıralama kuralları tasarlayın. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Kilitlenmeler: Tespit ve Önleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. ACID Özellikleri ve Anormallikler
  2. Yalıtım Düzeyleri: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. Kilitlenmeler: Tespit ve Önleme
  4. İyimser ve Kötümser Kilitleme
← SQL Academy Sayfasına Dön