Oracle hataları

ORA-00060: deadlock detected while waiting for resource

Kilitlenme (deadlock) — iki oturum birbirini bekledi

ORA-00060: deadlock detected while waiting for resource

İki oturumun her biri, diğerinin tuttuğu bir kilidi bekliyordu. Oracle döngüyü kırmak için oturumlardan birinde bir ifadeyi geri aldı. Oturumların satırları aynı sırayla kilitlemesini sağlayın ve foreign key kolonlarını indeksleyin.

Ne anlama gelir?

Deadlock, A oturumu B’nin kilitlediği bir satırı beklerken B’nin de A’nın kilitlediği bir satırı beklemesidir. İkisi de ilerleyemez; Oracle döngüyü fark eder, oturumlardan birinde ifadeyi (işlemin tamamını değil) geri alır ve ona ORA-00060 döndürür. O işlemin geri kalanı hâlâ açıktır — uygulama rollback yapmalı ya da yeniden denemelidir. Oracle ayrıca deadlock grafiğini içeren bir trace dosyası yazar ve alert log’a not düşer.

Yaygın nedenler

Nasıl çözülür?

  1. Alert log’da adı geçen trace dosyasını açın; deadlock grafiği iki oturumu ve çalıştırdıkları SQL’i gösterir.
  2. Her kod yolunun satırları aynı sırayla kilitlemesini sağlayın (örneğin birincil anahtara göre sıralı).
  3. Alt tablolardaki foreign key kolonlarını indeksleyin; özellikle üst satırlar güncelleniyor ya da siliniyorsa.
  4. ORA-00060 sonrasında uygulamada işlemi geri alıp yeniden deneyin.

Örnek

İndeksi olmayan foreign key kolonlarını bulun (ilk kolon kontrolü):

SELECT c.table_name, cc.column_name, c.constraint_name
  FROM user_constraints c
  JOIN user_cons_columns cc ON cc.constraint_name = c.constraint_name
 WHERE c.constraint_type = 'R'
   AND cc.position = 1
   AND NOT EXISTS (
       SELECT 1 FROM user_ind_columns ic
        WHERE ic.table_name = cc.table_name
          AND ic.column_name = cc.column_name
          AND ic.column_position = 1);

SQLlightspeed’de

Bir ifade hata verdiğinde SQLlightspeed’in hata paneli, hata kodunu sade bir Türkçe açıklama ve ne yapmanız gerektiğine dair bir öneriyle; Oracle’ın kendi mesajı ve Oracle dokümantasyonuna bağlantıyla birlikte gösterir — bu hata ve sık görülen onlarca başka hata için.

İlgili hatalar

ORA-00054ORA-01555ORA-00001 Tüm Oracle hataları →

Oracle dokümantasyonu: ORA-00060. Oracle, Oracle Corporation’ın tescilli ticari markasıdır. SQLlightspeed’in Oracle ile bir bağlantısı yoktur.