--Deadlock Query statement
Select bs.username "Blocking user", bs.username "DB user",
Ws.username "Waiting User", BS. Sid "Sid", WS. SID "Wsid",
bs.serial# "serial#", bs.sql_address "address",
Bs.sql_hash_value "SQL Hash", bs.program "Blocking App",
Ws.program "Waiting App", bs.machine "Blocking machine",
Ws.machine "Waiting Machine", Bs.osuser "Blocking OS User",
Ws.osuser "Waiting OS User", bs.serial# "serial#",
ws.serial# "wserial#",
DECODE (wk. TYPE,
' MR ', ' Media Recovery ',
' RT ', ' Redo Thread ',
' UN ', ' USER Name ',
' TX ', ' Transaction ',
' TM ', ' DML ',
' UL ', ' PL/SQL USER LOCK ',
' DX ', ' Distributed xaction ',
' CF ', ' Control FILE ',
' Is ', ' Instance state ',
' FS ', ' FILE SET ',
' IR ', ' Instance Recovery ',
' ST ', ' Disk SPACE Transaction ',
' TS ', ' Temp Segment ',
' IV ', ' Library Cache invalidation ',
' LS ', ' LOG START OR Switch ',
' RW ', ' ROW Wait ',
' SQ ', ' Sequence number ',
' TE ', ' Extend TABLE ',
' TT ', ' Temp TABLE ',
Wk. TYPE
) Lock_type,
DECODE (Hk.lmode,
0, ' None ',
1, ' NULL ',
2, ' Row-s (SS) ',
3, ' Row-x (SX) ',
4, ' SHARE ',
5, ' S/row-x (SSX) ',
6, ' EXCLUSIVE ',
To_char (Hk.lmode)
) Mode_held,
DECODE (Wk.request,
0, ' None ',
1, ' NULL ',
2, ' Row-s (SS) ',
3, ' Row-x (SX) ',
4, ' SHARE ',
5, ' S/row-x (SSX) ',
6, ' EXCLUSIVE ',
To_char (Wk.request)
) mode_requested,
To_char (HK.ID1) lock_id1, To_char (HK.ID2) Lock_id2,
DECODE
(HK. BLOCK,
0, ' not Blocking ', /**//* not Blocking any other processes */
1, ' Blocking ', /**//* this lock blocks other processes */
2, ' Global ', /**//* This lock are Global, so we can ' t tell */
To_char (HK). BLOCK)
) blocking_others
From V$lock HK, v$session BS, V$lock wk, v$session ws
WHERE HK. BLOCK = 1
and Hk.lmode! = 0
and Hk.lmode! = 1
and wk.request! = 0
and WK. TYPE (+) = HK. TYPE
and WK.ID1 (+) = Hk.id1
and Wk.id2 (+) = Hk.id2
and HK. SID = BS. SID (+)
and WK. SID = ws. SID (+)
and (Bs.username is not NULL)
and (Bs.username <> ' SYSTEM ')
and (Bs.username <> ' SYS ')
ORDER by 1;
Query the SELECT statement that a deadlock occurred
Select Sql_text from V$sql where Hash_value in (
Select Sql_hash_value from V$session where SID in (select session_id from V$locked_object)
)
How to check database deadlock
First, the phenomenon of database deadlock
During the execution of the program, click OK or save button, the program is not responding, there is no error.
Second, the principle of deadlock
When you perform an update or delete operation on a column of a table in a database, the statement does not mention
The other statement that the update operation for this column of data will be in the waiting state at execution time,
At this point the phenomenon is that this statement has been executing, but has not executed successfully, and no error.
Three, the method of locating the deadlock
By checking the database tables, it is possible to check which statement is deadlocked and which is the machine that generated the deadlock.
1) Execute the following statement with the DBA user
In (select session_id from V$locked_object)
If there is a result of the output, then there is a deadlock, and the machine that can see the deadlock is which one. Field Description:
Username: The database user used by the deadlock statement;
Lockwait: The state of the deadlock if there is a content representation being deadlocked.
Status: State, active indicates deadlock
Machine: The device where the deadlock statement resides.
Program: The main application that generated the deadlock statement.
2) You can view the deadlock statement by executing the following statement with the DBA user
Select Sql_text from V$sql where Hash_value in
(select Sql_hash_value from v$session where SID in
(select session_id from V$locked_object))
Iv. methods of deadlock resolution
In general, as long as the statement that produces the deadlock is committed, but in the actual execution. Users can
It is not known which sentence to generate a deadlock. You can shut down the program and restart it.
Often encountered this problem in the use of Oracle, so also summed up a little solution.
1) To find the deadlock process:
Sqlplus "/as sysdba" (Sys/change_on_install)
WHERE L.session_id=s.sid;
2) Kill the deadlock process:
Alter system kill session ' sid,serial# '; (where sid=l.session_id)
3) If it is not resolved:
Select Pro.spid from v$session ses, v$process Pro where ses.sid=xx and ses.paddr=pro.addr;
Where SID is replaced with a dead-lock SID:
Exit
Ps-ef|grep spid
Where SPID is the process number of this process, kill the Oracle process.
Oracle deadlock detection Query and processing