Oracle enq: TX - row lock contention Nedir

TX ROW LOCK: Aynı satıra iki farklı write isteği geldiğinde yaşanır. 

Evet olay bitti :)

Neyse biraz daha analojili falan anlatmak gerekirse: Şu anda bu yazıyı okuyorsun ama aynı anda araba kullanmıyorsun. Di mi? Lütfen kullanma çünkü. Veritabanında da aynı mantık geçerli. Bir satır için iki update aynı anda geldiyse ikisi aynı anda gerçekleşemez. Hangisini yapacağı net değildir. Bu durumda row lock oluştuğunu gözlemleriz.  

Örnek A kullanıcımız altında bir tablo yaratalım:

 

 B adlı user olarak satırı update edelim. Dikkat ederseniz commit etmiyorum.

 

 C kullanıcısı olarak update çalıştıralım şimdi de:

 

 Update adımında takılı kaldık görüldüğü gibi. DB aslında şu anda lock üretti. Locku aşağıdaki v$session sorgumuz ile kontrol edelim:


SELECT
    W.USERNAME AS WAITING_USERNAME
   ,W.event AS WAITING_EVENT
   ,B.USERNAME AS BLOCKING_USERNAME
   ,B.event AS BLOCKING_EVENT
FROM V$SESSION W
JOIN V$SESSION B
ON W.BLOCKING_SESSION = B.SID;

çıktımız şu şekilde olur:

 

 TX - row lock contention olarak gözlemleyebiliyoruz ve B kullanıcısının yani ilk çalıştırdığımız update'in C'nin çalıştırdığını blokladığını gözlemleyebiliyoruz. Bunu çözmek istiyorsak ilk sessionun tamamlanmasını veya kill edilmesini sağlamalıyız.

 

Yorumlar