ORA-00060: Deadlock detected

Ora-00060 deadlock hatası 2 veya daha sessionın aynı data setine lock koyması yapmaya çalışması aynı zamanda diğer sessionlardan da lock requestleri gelmesi sonucunda olayın dairesel bir hal alması durumunda ortaya çıkay durum olarak tanımlayabiliriz. Oracle deadlock hatasına internal olarak müdahale ederek kullanıcıya “ORA-00060: deadlock detected while waiting for resource” hatasını dönerek kiliti kendisi çözmektedir.

Bu yazı ile anlatmak istediğim tam olarak şu aslında, aşağıda ben test senaryosu oluşturmaya çalışırken çok basit bir şekilde 2 tane farklı session açarak senaryomu oluşturdum. Ancak concurrent olarak yüzlerce sessionın olduğu büyük yapıları düşündüğünüz de sorunun kaynağını tespit etmek çok da kolay olamayabiliyor. Dolayısıyla tamda bu nokta da işimizi nasıl kolaylaştırabiliriz ondan bahsediyor olacağım.

Aşağıdaki gibi bir deadlock durumu oluşturmadan önce, aşağıdaki event’ ı set ederek sonucunu gözlemleyelim ve üzerinde konuşalım;

SQL> ALTER SYSTEM SET EVENTS ‘10027 trace name context forever, level 2’;
System altered.

Şimdi aşağıdaki update’ ler yardımı ile deadlock senaryosunu oluşturalım ;

— 1. Session
SQL> update kamil.t20 set name = ‘kayra’ where id =1 ;
1 row updated.

— 2. Session
SQL> update kamil.t20 set name = ‘mehmet’ where id =2 ;
1 row updated.

— 1. Session
SQL> update kamil.t20 set name = ‘kamil’ where id =2 ;
update kamil.t20 set name = ‘kamil’ where id =2
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource

— 2.session
SQL> update kamil.t20 set name = ‘bekir’ where id =1 ;

2. sessiondan son sorguyu bastığımız da 1. Sessiona ora-00060 hatasını verdiğini göreceksiniz. Alertlog’ dan baktığınız da aşağıdaki satırları bastığını göreceksiniz;

–ALERT LOG ;
Mon Mar 07 14:12:33 2016
diag_adl:OS Pid: 25366 executed alter system set events ‘10027 trace name context forever, level 2’
Mon Mar 07 14:13:01 2016
diag_adl:System State dumped to trace file /u01/ora1/oracle/diag/rdbms/tpdb/tpdb/trace/tpdb_ora_25366.trc
Mon Mar 07 14:13:02 2016
diag_adl:ORA-00060: Deadlock detected. See Note 60.1 at My Oracle Support for Troubleshooting ORA-60 Errors. More info in file /u01/ora1/oracle/diag/rdbms/tpdb/tpdb/trace/tpdb_ora_25366.trc.

Buradan açmış olduğumuz’ a event’ a istinaden oluşan trace file’ in adını ve path’ ini görebilirsiniz. Trace file’ imizi açarak içeriğine göz atalım ve sonrasında üzerinde konuşalım ;

[SID=tpdb:oracle@Redhat70 trace]$ more tpdb_ora_25366.trc
Trace file /u01/ora1/oracle/diag/rdbms/tpdb/tpdb/trace/tpdb_ora_25366.trc
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
ORACLE_HOME = /u01/ora1/oracle/db/12.1.0.2
System name: Linux
Node name: Redhat70
Release: 2.5.30-501.16.2.el6.x86_64
Version: #1 SMP Tue Mar 10 17:01:00 EDT 2015
Machine: x86_64
Instance name: tpdb
Redo thread mounted by this instance: 1
Oracle process number: 80
Unix process pid: 25366, image: oracle@Redhat70 (TNS V1-V3)

*** 2016-03-07 14:13:01.663
*** SESSION ID:(31.62742) 2016-03-07 14:13:01.663
*** CLIENT ID:() 2016-03-07 14:13:01.663
*** SERVICE NAME:(plug1_db) 2016-03-07 14:13:01.663
*** MODULE NAME:(sqlplus@Redhat70 (TNS V1-V3)) 2016-03-07 14:13:01.663
*** CLIENT DRIVER:(SQL*PLUS) 2016-03-07 14:13:01.663
*** ACTION NAME:() 2016-03-07 14:13:01.663
*** CONTAINER ID:(3) 2016-03-07 14:13:01.663

*** TRACE FILE RECREATED AFTER BEING REMOVED ***

*** 2016-03-07 14:13:01.663
DEADLOCK DETECTED ( ORA-00060 )
See Note 60.1 at My Oracle Support for Troubleshooting ORA-60 Errors
[Transaction Deadlock]

The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:

Deadlock graph:
———Blocker(s)——– ———Waiter(s)———
Resource Name process session holds waits process session holds waits
TX-00020001-00004AA2-00000000-00000000 80 31 X 86 257 X
TX-00030020-00004D28-00000000-00000000 86 257 X 80 31 X

session 31: DID 0001-0050-00028B99 session 257: DID 0001-0056-000056CD
session 257: DID 0001-0056-000056CD session 31: DID 0001-0050-00028B99

Rows waited on:
Session 31: obj – rowid = 00016BF0 – AAAWvxAA9AAAAFsAAB
(dictionary objn – 93168, file – 61, block – 364, slot – 1)
Session 257: obj – rowid = 00016BF0 – AAAWvxAA9AAAAFsAAA
(dictionary objn – 93168, file – 61, block – 364, slot – 0)

—– Information for the OTHER waiting sessions —–
Session 257:
sid: 257 ser: 64029 audsid: 4294967295 user: 0/SYS
pdb: 3/PLUG1_DB
flags: (0x41) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
flags2: (0x40009) -/-/INC
pid: 86 O/S info: user: oracle, term: UNKNOWN, ospid: 25449
image: oracle@Redhat70 (TNS V1-V3)
client details:
O/S info: user: oracle, term: pts/12, ospid: 25446
machine: Redhat70 program: sqlplus@Redhat70 (TNS V1-V3)
application name: sqlplus@Redhat70 (TNS V1-V3), hash value=3714223496
current SQL:
update kamil.t20 set name = ‘bekir’ where id =1

—– End of information for the OTHER waiting sessions —–

Information for THIS session:

—– Current SQL Statement for this session (sql_id=56k6pyv7m9bvd) —–
update kamil.t20 set name = ‘kamil’ where id =2
===================================================
PROCESS STATE
————-
Process global information:
process: 0x1aab7e2b0, call: 0x1910faaa0, xact: 0x1a4cc8228, curses: 0x1aacf0aa8, usrses: 0x1aacf0aa8
in_exception_handler: no
—————————————-
SO: 0x1aab7e2b0, type: 2, owner: (nil), flag: INIT/-/-/0x00 if: 0x3 c: 0x3
proc=0x1aab7e2b0, name=process, file=ksu.h LINE:13949, pg=0 conuid=0
(process) Oracle pid:80, ser:55, calls cur/top: 0x1910faaa0/0x1910faaa0
flags : (0x0) – icon_uid:0
flags2: (0x0), flags3: (0x10)
intr error: 0, call error: 0, sess error: 0, txn error 0
intr queue: empty
ksudlp FALSE at location: 0
(post info) last post received: 140 0 2
last post received-location: ksl2.h LINE:3108 ID:kslpsr
last process to post me: 0x1aab518b0 1 6
last post sent: 0 0 9
last post sent-location: ksq.h LINE:2797 ID:ksqrcl
last process posted by me: 0x1aab825a0 127 0
waiter on post event: 0
(latch info) hold_bits=0x0
Process Group: DEFAULT, pseudo proc: 0x1aac31810
O/S info: user: oracle, term: UNKNOWN, ospid: 25366
OSD pid info:
PDB SWITCH DEPTH : 0
….
….
….

Database’ de oluşan deadlock’ lar ile ilgili detaylı bilgiye sahip olmak için oracle tarafından yayınlanmış olan Event 10027’ yi kullanabiliriz. Oluşan trace file ‘in içeriğine baktığımız da deadlock’ a yol açmış olan sessionlara ait bilgiler, çalıştırdıkları current sql’ leri, lock’ a sebebiyet veren object’ e ait file-block bilgileri, sorgunun çalıştırıldığı host, machine bilgileri , sorgunun hangi programdan çalıştırıldığı gibi çok detaylı bilgilere ulaşabileceğimizi görebilirsiniz. 10046 nolu event ile ilgili olarak hangi seviyede hangi bilgilerin toplanacağı ile ilgili detay bilgiye aşağıdaki grafikden de ulaşabilirsiniz.

3

Trace almayı durdurmak için aşağıdaki komut ile event’ ı stop edebiliriz ;

SQL> ALTER SYSTEM SET EVENTS ‘10027 trace name context forever, level 0’;
System altered.

Be Sociable, Share!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


+ bir = 8