Deadlock kayıtlar üzerinde oluşan (lock) kilitlerle ilgili özel bir durumdur. Eğer iki veya daha fazla session birbirlerinin kilitledikleri (değişiklik yapıp commit etmedikleri) kayıtlar üzerinde işlem yapmaya çalışırsa deadlock oluşur. Olayın daha iyi anlaşılabilmesi için bir örnek yapalım. Sqlplus veya benzer bir araçla içinde örnek schemaların olduğu bir veritabanına HR kullanıcısı ile bağlanalım:
SQL> UPDATE employees SET salary = 40000 WHERE employee_id = 100;
Bu oturum açıkken, yeni bir sqlplus açıp, HR ile tekrar bağlanalım ve şu komutu çalıştıralım:
SQL> UPDATE employees SET first_name = ‘Yusuf’, last_name = ‘Arslan’
WHERE employee_id = 101;
Bu durumda 1. sqlplus penceresinde, yani 1. oturumda EMPLOYEES tablosunda employee_id’si 100 olan kayıdı, 2. oturumda ise employee_id’si 101 olan kayıdı kilitlemiş olduk.
Şimdi tekrar 1. oturumda şu komudu çalıştıralım:
SQL> UPDATE employees SET salary = 30000 WHERE employee_id = 101;
Bu komudu çalıştırdığımız zaman oturum lock’a girecek ve 2. oturumun 101′nolu employee’yi bırakmasını beklemeye başlayacaktır. Eğer 2. oturumda biz COMMIT veya ROLLBACK komutlarını çalıştırırsak, 1. oturum lock’tan kurtulur. Biz ise işi zorlaştırmak için 2. oturumda, employee_id’si 100 olan kayıtta değişiklik yapmaya çalışalım:
SQL> UPDATE employees SET manager_id = 101 WHERE employee_id = 100;
Bu komutu çalıştırır çalıştırmaz bir deadlock oluşacaktır. Çünkü bu komut 2. oturumun 1. oturumun kilitlediği kayıdı bırakmasını beklemek zorundadır. Ama 1. oturum hali hazırda zaten lock’ta beklemekte olduğundan kayıdı bırakması mümkün değildir. Teorik olark böyle bir durum bu iki oturumu beraberce sonsuz beklemeye sokar, ama Oracle deadlockları otomatik olarak algılar ve ORA-00XXX hatası vererek deadlock’a sebep olan komutu (bizim örneğimizde 1. oturumda beklemekte olan 2. update’i) sonlandırır.
Böyle bir durumda yapılması gereken, ORA-00XXX hatası alan oturumun COMMIT veya ROLLBACK komutları ile transactionı sonlandırmasını sağlamaktır. Bizim örneğimizde deadlock ile ilgili hatayı alan 1. oturumda eğer transactionı sonlandırmak için COMMIT kullanırsak sadece 2. update’i, eğer ROLLBACK kullanırsak her iki UPDATE komutunu da tekrar çalıştırmamız gerekecektir.
Konu 84 kere Okundu
Kategori Oracle
Beğendiyseniz Paylaşın
- Google Buzz ekleyin
- Delicious
- Digg this
- StumbleUpon
- MySpace
- Technorati

Yusuf Arslan
Oracle Open Source
1985 Tokat/Reşadiye doğumluyum.İlk-orta-lise hayatını Amasya/Suluova ilçesinde geçirdim.Sakarya Üniversitesi Bilgisayar Mühendisliği bölümünü bitirdikten sonra kariyerime Oracle,SAP alanlarında danışmanlık vermek üzere devam etmekteyim. Kullandığım,bildiğim teknolojiler ve diller; SAP BO Oracle BI Applications Oracle Data Mining Oracle BI Reports(http://www.iski.gov.tr/web/statik.aspx?KID=1000717) Oracle Data Integrator Oracle BI Publisher(XML Publisher) Oracle Database 10g Oracle Mapviewer PL/SQL,Java,Oracle JDeveloper,Oracle Forms-Reports,C# Data warehouse process optimization Database system implementation Using encoding for security systems Software development, test and deployment Presentation and communication skills Bu adreslerden de bana ulaşabilirsiniz, [email protected] https://datawarehouse.gen.tr/ http://www.arslanyusuf.blogspot.com/ http://yusufarslaneng.blogspot.com/ http://twitter.com/yusars http://tr.linkedin.com/pub/yusuf-arslan/27/35b/57bWebsite: arslanyusuf.blogspot.com/ E-posta: Bu e-Posta adresi istek dışı postalardan korunmaktadır, görüntülüyebilmek için JavaScript etkinleştirilmelidir
En Son Yusuf Arslan
Yorum yaz
Make sure you enter the (*) required information where indicated.
Basic HTML code is allowed.