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
- Aynı satırları farklı sırayla güncelleyen iki kod yolu.
- İndekssiz foreign key kolonları: üst tablodaki değişiklikler alt tablonun tamamını kilitler.
- Eşzamanlı DML yapılan tablolardaki bitmap indeksler.
- Çok güncellenen bloklarda yetersiz işlem yuvası (ITL).
Nasıl çözülür?
- 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.
- Her kod yolunun satırları aynı sırayla kilitlemesini sağlayın (örneğin birincil anahtara göre sıralı).
- Alt tablolardaki foreign key kolonlarını indeksleyin; özellikle üst satırlar güncelleniyor ya da siliniyorsa.
- 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.