Merhaba,
Bugün bana gelen bir soru üzerine bu makaleyi yazmaya karar verdim. Öncelikle soru ile başlıyorum;
"
Arka arkaya birkaç insert işleminden sonra ORA-00054: resource busy and acquire with NOWAIT specified hatası alıyorum ama bu hatayı almadan, belirli bir süre boyunca session'ın beklemesini istiyorum
"
ORA-00054 hatasını almamızın nedeni; A session'ı ilgili tablo üzerinde "exclusive lock" olarak bildiğimiz bir DML kilit alırsa, B session'ı da ALTER TABLE gibi bir DDL komutunu yine ilgili tablo için gönderirse, gelen DDL komutu bekler ya da bu hatayı basar. Ne zamanki DML kilidi bırakılır ve v$locked_object üzerinde gözükmez, o zaman gelen ALTER TABLE DDL komutu işleme alınır.
DDL_LOCK_TIMEOUT parametresi varsayılan olarak 0'dır (saniye) ve DML lock alınmış bir tabloya DDL gönderdiğimiz zaman hemen ORA-00054 hatası basılır. DDL_LOCK_TIMEOUT parametresi 10 saniye olsaydı DDL operasyonunu yapmak isteyen session'a 10 saniye süre verilecekti ve bu sürede diğer session'dan (DML kilidi almış olan) bir commit ya da rollback gelmediğinde ORA-00054 10 saniye sonra ekrana basılacaktı.
DDL_LOCK_TIMEOUT'un azami parametresi 1.000.000 saniye olabiliyor. Uygulamanızın çalışma mekanizmasına göre bu parametre ile oynamanız faydalı da olabilir zararlıda.
İyi çalışmalar.
Ogan