İki doğru kilit isteği birlikte ilerleyemeyebilir
Bir ajan birinci kaynağı ayırdı, ikinciyi bekliyor. Başka bir ajan ikinci kaynağı ayırmış, birinciyi bekliyor. İki işlem de yetkili ve istenen kaynaklar geçerli olabilir; yine de hiçbiri ilerleyemez. Tek bir kaynağa aynı anda yazılmasını önlemek, birden çok kaynak kullanan işlerin tamamlanacağını garanti etmez. Bekleme ilişkilerini birlikte çizmek, bu tür bir kilitlenmeyi tek tek hata mesajlarından daha açık gösterir.
Bu yazıda K1 ve K2 iki sentetik özel erişim kilididir. A ve B ajanlarının ikisi de işi tamamlamak için ikisini birden ister. Bir kilit aynı anda yalnız bir ajanda bulunabilir. Ajan elde ettiği kilitleri işi bitirene kadar bırakmaz; dış işlem veya gerçek rezervasyon yapılmaz. Bu basit sözleşme altında döngüsel beklemeyi ve ortak sıra kuralının etkisini inceleyeceğiz.
Sahiplik ile beklemeyi ayrı kaydedin
| Adım | A ajanı | B ajanı | Sonuç |
|---|---|---|---|
| 1 | K1’i alır | Henüz kilit yok | K1 sahibi A |
| 2 | K1’i tutar | K2’yi alır | K2 sahibi B |
| 3 | K2’yi ister, bekler | K2’yi tutar | A, B’yi bekler |
| 4 | K1’i tutmaya devam | K1’i ister, bekler | B, A’yı bekler |
Sahiplik: K1→A, K2→B. Bekleme: A→B ve B→A. A işi bitirmek için B’nin, B işi bitirmek için A’nın kilit bırakmasını bekler. Bu sözleşmede kendiliğinden ilerleme yoktur.
Bekleme oklarını kaynaklara değil ajana yönelttiğimiz bu gösterimde bir döngü bulunur. Kilidin boşalmasını beklemek olağan bir durum olabilir; her bekleme kilitlenme değildir. Sorun, bekleyenlerin birbirinin tamamlanmasına bağlı hale gelmesidir. Bir ajan yalnız başka bir işi bekleyip elinde o işin gerektirdiği kaynak yoksa aynı döngü oluşmayabilir. Bu nedenle yalnız bekleme süresinin uzunluğuna bakmak yerine sahiplik ve ihtiyaç ilişkisini inceleyin.
PostgreSQL belgeleri, birden çok nesnenin kilitlerini bütün uygulamalarda tutarlı sırayla almayı kilitlenmeden korunmanın temel yollarından biri olarak açıklar. Buradaki K1 önce, K2 sonra düzeni bu fikrin iki kaynaklı öğretim uygulamasıdır. Gerçek veri tabanının kilit türleri, işlemleri sonlandırma davranışı ve hata yönetimi ayrıca incelenir. Bu küçük tablo bütün eşzamanlılık sorunlarının çözüldüğünü göstermez.Kaynak: PostgreSQL — Explicit Locking: Deadlocks
Her ajan aynı kaynak sırasını izlesin
Yeni kural, bir iş her iki kilidi istiyorsa önce K1, sonra K2 almasıdır. İş tanımında kaynaklar K2,K1 sırasıyla yazılsa bile kilit alma planı ortak sıraya çevrilir. Birden fazla kaynağın kimlikleri için kararlı ve bütün katılımcıların aynı yorumladığı toplam sıra gerekir. Sıra yalnız bir ajan için uygulanıp diğerinde eski düzen kalırsa önceki döngü hâlâ oluşabilir.
| Adım | A ajanı | B ajanı |
|---|---|---|
| 1 | K1’i alır | K1’i ister; hiçbir kilit tutmadan bekler |
| 2 | K2’yi alır | K1’i bekler |
| 3 | İşi bitirir; K2 ve K1’i bırakır | K1’i alabilir |
| 4 | Tamamlandı | K2’yi alır, işi bitirir, kilitleri bırakır |
B başlangıçta beklemektedir, fakat A’nın ihtiyaç duyduğu K2’yi elinde tutmaz. Bu yüzden A ikinci kilidi alıp tamamlanabilir. A tamamlandıktan sonra B devam eder. İki işin aynı anda bitmesi gerekmiyor; önemli olan bu sözleşmede döngüsel beklemenin oluşmamasıdır. Son tabloda iki işin de tamamlanması, gerçek hizmette zaman veya adil sıra garantisi verildiği anlamına gelmez.
Sıra kuralı döngüyü neden bozar?
Her ajan yalnız elindeki en büyük sıradan daha sonraki bir kilidi bekliyorsa bekleme zinciri kaynak sırası boyunca ileri gider. Sonlu ve tutarlı bir sırada sürekli ileri gidip başladığınız daha küçük kaynağa dönemezsiniz. Bu gerekçe, bütün katılımcıların kurala uymasına dayanır. Gizli başka kilitler, kilit yükseltme veya farklı kaynak sınıfları varsa bunların da aynı tasarımda ele alınması gerekir.
İzinli alma sırası: K1→K2. K2 tutarken K1 beklemek kurala aykırıdır. Düzeltilmiş akışta bekleme yalnız B→A; A→B yok. Son sahiplik: K1 boş, K2 boş. Tamamlanan iş: A ve B.
Zaman aşımı eklemek farklı bir araçtır. Bekleyen işi durdurup elindeki kilitleri bırakabilirsiniz; bu kilitlenmenin etkisini sınırlar, fakat aynı sırayla yeniden başlayan ajanlar tekrar çakışabilir. İptal sırasında hangi kaynakların bırakıldığı ve hangi işlerin geri alındığı açık olmalıdır. Dış sistemde oluşan bir etki yalnız yerel kilit bırakıldı diye geri alınmış sayılmaz. Bu örnekte böyle dış etkiler özellikle bulunmamaktadır.
Ajan planını bir sahiplik günlüğüyle sınayın
Sentetik K1/K2 özel erişim kilitleri; A ve B ikisini birden ister, iş bitene kadar aldığını tutar. Önce A K1, B K2 alıp diğerini isterken sahiplik ve bekleme çizgesini kur. Sonra bütün ajanlar için K1→K2 sırası uygula. Her adımda kimin neyi tuttuğunu ve neyi beklediğini yaz. Döngü ile sıradan beklemeyi ayır. Zaman aşımını geri alma garantisi sayma; gerçek veri tabanı veya dış işlem çalıştırma.
Bir araç zinciri içinde kilitler farklı hizmetler tarafından yönetiliyorsa yalnız prompta sıra kuralı eklemek yeterli değildir. Kilit alma katmanı bunu gerçekten uygulamalı ve ihlalleri kaydetmelidir. Testte iki ajanın sırasını bilinçli olarak ters başlatın; yeni düzenin yine aynı kaynak sırasını seçtiğini görün. Çalışma defterinde yalnız başarılı son durumu değil, bekleme sırasında elde tutulan kilitleri de saklayın.
- Bütün katılımcılar aynı toplam sırayı kullanıyor mu?
- Bekleyen ajan hangi kilitleri tutuyor?
- Bekleme çizgesinde geri dönen yol var mı?
- Tamamlanma ve iptal sonrasında sahiplik temiz mi?
Üç kaynaklı döngüyü çözün
K1, K2, K3 için üç ajan olsun. A K1’i tutup K2’yi, B K2’yi tutup K3’ü, C K3’ü tutup K1’i bekliyor. Bekleme döngüsünü yazın. Ortak sıra K1<K2<K3 olduğunda C’nin ihtiyaç duyduğu K3 ve K1’i hangi sırayla alması gerekir? Bu örnekte hangi ters alma adımı döngüyü kapatıyordu?
Döngü A→B→C→A. C kaynaklarını K1 sonra K3 sırasıyla almalıdır. K3’ü tutarken daha küçük K1’i istemesi ortak sırayı ihlal eder. Bütün katılımcılar ortak sıraya uyarsa bu tür döngü kurulmaz; bekleme süreleri ve adillik ayrıca değerlendirilir.
Eşzamanlı ajan testine sahiplik ve bekleme izini eklemek, tek bir çağrının doğru olmasının neden bütün işin ilerlemesine yetmediğini gösterir. Tesliminiz ortak sıra, ihlal örneği ve tamamlanma sonrası kaynak durumu içerdiğinde kilit tasarımını somut olarak inceleyebilirsiniz.
Kaynaklar ve doğrulama
- PostgreSQL — Explicit Locking: Deadlocks
Birden çok nesnenin kilidini tutarlı sırada alma ile döngüsel beklemeyi önleme.
Erişim ve kontrol:
AI Ajanları ve İş Akışı Otomasyonu
Çok kaynak kullanan iş akışınız için AI Ajanları ve Otomasyon programını inceleyebilirsiniz. Kilit sırasını ve işin bitiş koşulunu, ekibinizin gerçek kaynak adlarını içermeyen bir senaryo üzerinde çalışın.
- Kuruma özel planlanır