Minimizing System Contention ( 14- Blocking Lock ile Başetme )


Blocking Lock ile Başetme


  - Bir blocking lock ile uğraşırken iki temel strateji vardır: kısa vadeli ve uzun vadeli bir strateji.
 Yapmanız gereken ilk şey, "blocking lock" ı ortadan kaldırmak, böylece oturumlar kuyrukta kalmaya devam etmeyecektir
 - Düzinelerce hatta yüzlerce oturumdan tek bir  blocking lockın olması hiç de nadir değildir, hepsi bloklanan objeyi beklemektedir.
 Blocking session SID'sini zaten bildiğinizden (örneğimizde oturumumuz 68), oturum için ilgili serial# için V$SESSION viewını sorguladıktan sonra oturumu bu şekilde sonlandırın:

  SQL> alter system kill session '68, 1234';
 
  - Kısa vadeli çözüm, "blocking locks" tan hızlı bir şekilde kurtulmak ve böylece veritabanınızın performansına zarar vermemektir. Blocking session ı basitçe kill ederek onlardan kurtulursun. Blocking session ın arkasında bekleyen blocked session ların uzunca sıralandığını görürseniz, diğer oturumların devam edebilmesi için blocking sessionı kill edin.
 
  - Uzun vadede, blocking session ın neden bu şekilde davrandığını araştırmanız gerekir. Genellikle, uygulama mantığında bir kusur bulacaksınız. Bununla birlikte, blocking sessionın yürüttüğü SQL kodunun derinliklerine inmeniz gerekebilir.
 
 
  Nasıl Çalışır:

  - Bu örnekte açıkçası, "blocking lock" bir DML kilidi. Bununla birlikte, bunu bilmiyorisek , V$LOCK viewının TYPE (TY) sütununu inceleyerek kilidin türünü bulabilirsin. Oracle, library cache i ve diğer bileşenleri korumak için çeşitli iç "sistem kilidi" türlerini kullanmaktadır ancak bu kilitler normaldir ve V$LOCK görünümünde bu kilitlerle ilgili bir şey bulamazsınız.
 
  - DML işlemleri için Oracle, iki temel kilit türü kullanır: transaction locks (TX) ve DML locks (TM).
  Üçüncü tip bir kilit, user lock (UL) var, ancak genel kilitleme sorunlarının giderilmesinde rol oynamıyor.
  Transaction locks, Oracle kilitleme sorunlarını gidermek için karşılaşacağınız kilitlerin en sık kullanılan türdür.
  Bir transaction, veri her değiştirdiğinde, row transaction lock olan TX kilidini çağırır. Öte yandan, DML kilidi TM, bir DML ifadesi tarafından değiştirilen her nesne için bir kez edinilir.
 
  - LMODE sütunu, "6" numaralı özel bir kilidi belirterek, kilit modunu gösterir. REQUEST sütununda istenen kilit modu gösterilir. Bir satırı ilk değiştiren oturum, LMODE = 6 ile özel bir kilit tutar.
  Bu oturumun REQUEST sütununda, bir kilit istemediğinden 0 değeri gösterilir; zaten bir kilidi vardır!
  Blocked session ın ihtiyacı olmasına rağmen aynı satırlarda özel bir kilit elde edemiyor, bu nedenle de özel modda (MODE = 6) bir TX isteğinde bulunuyor. Yani, engellenen oturumun REQUEST sütununda 6, LMODE sütununda 0 değerinde (engellenen bir oturum hiç bir modda kilitlenmez) bir değer gösterecektir.
 
  - Önceki tartışma, her zaman özel modda alınan "row locks" için geçerlidir.
  Bir TM kilidi normalde "Shared Row Exclusive mode" olan mod 3'te kazanılırken, bir DDL bildirimi bir TM özel kilidine ihtiyaç duyar.
 

Constraint Disable-Enable

Disable Constraint BEGIN   FOR c IN   (SELECT c.owner, c.table_name, c.constraint_name    FROM user_constraints c, user_tables t    WHERE...