İyimser ve Kötümser Kilitleme
SELECT ... FOR UPDATE (kötümser) ile sürüm sütunu / WHERE updated_at = ? (iyimser) kalıplarını karşılaştırın.
İyimser ve Kötümser Kilitleme, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 4. 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.
İki Eşzamanlılık Stratejisi
- Kötümser — satırı okuduğunuzda kilitleyin; başka hiç kimse satırı değiştiremesin
- İyimser — kilitlemeyin; güncelleme sırasında satırın değişmediğini doğrulayın
Kötümser: SELECT ... FOR UPDATE
Şimdi kilitleyin, daha sonra yazın:
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- other transactions cannot lock or update this row
-- compute new balance...
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;FOR SHARE
Okuma kilidi — diğerleri okuyabilir ancak yazamaz:
SELECT * FROM orders WHERE id = 1 FOR SHARE;
-- others can SELECT FOR SHARE but cannot UPDATEKötümser Yaklaşımın Artıları ve Eksileri
Artıları: anlaşılması kolaydır, yeniden deneme gerekmez.
Eksileri: eşzamanlılığı azaltır, kilit beklemelerine ve kilitlenmelere neden olabilir.
İyimser: Sürüm Sütunu
Sürümle birlikte okuyun, beklenen sürümün bulunduğu WHERE koşuluyla yazın:
BEGIN;
SELECT id, balance, version FROM accounts WHERE id = 1;
-- compute new balance...
UPDATE accounts
SET balance = ?, version = version + 1
WHERE id = 1 AND version = ?;
-- check rows affected: 0 means someone else updated, retryupdated_at ile İyimser Yaklaşım
Aynı fikir, açık bir sürüm sütunu yerine updated_at kullanılarak uygulanır:
UPDATE accounts
SET balance = ?, updated_at = NOW()
WHERE id = ? AND updated_at = ?;
-- If updated_at has changed in the meantime, 0 rows affected — retry.İyimser Yaklaşımın Artıları ve Eksileri
Artıları: yüksek eşzamanlılık, bekleme yok.
Eksileri: yazmalar başarısız olabilir ve yeniden deneme mantığı gerektirebilir; çakışma yalnızca UPDATE sırasında ortaya çıkar.
Kötümser Yaklaşımı Ne Zaman Seçmeli
Şu durumlarda:
- Yoğun erişilen satırlarda yüksek çekişme bulunan kısa işlemler
- Para transferleri — işin kısmen tamamlanmasını istemezsiniz
- Çakışma olasılığının yüksek olduğu uzun süren işlemler
İyimser Yaklaşımı Ne Zaman Seçmeli
Şu durumlarda:
- Çakışmaların nadir olduğu, çoğunlukla okuma yapılan iş yükleri
- İstemcinin istekler arasında satırı tuttuğu durum bilgisi içermeyen API'ler
- Mobil / çevrimdışı düzenleme ve ardından eşzamanlama
Karma: FOR UPDATE NOWAIT
Kilitlemeyi deneyin; satır kilitliyse hemen başarısız olun ve kullanıcının yeniden denemesine izin verin:
SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR if someone else holds it — user sees a friendly retry messageDanışma Kilitleri
Herhangi bir satıra bağlı olmayan uygulama düzeyindeki kilitler:
SELECT pg_try_advisory_xact_lock(hashtext('order:42'));
-- True if you got the lock, false otherwise — useful for cross-row coordination.Kilit Hedeflerini Dizine Eklemeyi Unutmayın
WHERE sütununda dizin olmadan kullanılan FOR UPDATE, beklenenden daha fazla satırı kilitleyebilir (yalnızca eşleşen satırları değil, taranan satırları kilitler).
Kilit Zaman Aşımları
Sonsuza kadar beklemeyi önlemek için lock_timeout değerini ayarlayın:
SET lock_timeout = '5s';
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- ERROR if lock not acquired in 5 secondsÖzet
Kötümser yaklaşım satırı kilitler; iyimser yaklaşım yazma sırasında denetler.
- Kötümser: FOR UPDATE — basittir ancak eşzamanlılığı azaltır
- İyimser: sürüm sütunu — daha fazla eşzamanlılık sağlar, yeniden deneme gerektirir
- İş yüküne göre seçim yapın; gerektiğinde yaklaşımları birleştirin
Hızlı Kontrol
E-ticaret stok azaltma işlemi yoğun çekişmeye maruz kalıyor. Genellikle hangi kilitleme stratejisi daha güvenlidir?
Sıkça Sorulan Sorular
“İyimser ve Kötümser Kilitleme” dersi ücretsiz mi?
Evet — “İyimser ve Kötümser Kilitleme” 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.
“İyimser ve Kötümser Kilitleme” dersinde ne öğreneceğim?
SELECT ... FOR UPDATE (kötümser) ile sürüm sütunu / WHERE updated_at = ? (iyimser) kalıplarını karşılaştırı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 4. dersidir.
“İyimser ve Kötümser Kilitleme” 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
- ACID Özellikleri ve Anormallikler
- Yalıtım Düzeyleri: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- Kilitlenmeler: Tespit ve Önleme
- İyimser ve Kötümser Kilitleme