Un lock wait è una condizione che si verifica quanto una sessione attende di prendere un lock su un oggetto che sul quale un’altra sessione l’ha già preso.
In questa situazione la sessione che attende è una sessione in Lock Wait.
Con questa query è possibile vedere quali sessioni sono in attesa
select
substr(HLD_APPLICATION_NAME,1,10) as "Hold App", -- Who is holding the lock
substr(HLD_USERID,1,10) as "Holder",
substr(REQ_APPLICATION_NAME,1,10) as "Wait App", -- Who is waiting on the lock
substr(REQ_USERID,1,10) as "Waiter",
LOCK_MODE as "Hold Mode",
LOCK_OBJECT_TYPE as "Obj Type",
substr(TABNAME,1,10) as "TabName",
substr(TABSCHEMA,1,10) as "Schema",
LOCK_WAIT_ELAPSED_TIME as "waiting (s)", -- How long is the wait
REQ_STMT_TEXT, -- new
HLD_CURRENT_STMT_TEXT, -- new
LOCK_NAME -- new
from
SYSIBMADM.MON_LOCKWAITS
Fra le colonne estratte ce ne è una interessante. La colonna waiting, ovvero da quanto tempo la sessione è in attesa.
Nella suddetta query è in attesa da 15 secondi.
La cosa interessante ti questo tempo è che in DB2 è possibile impostare un tempo massimo oltre il quale la sessione in attesa viene sbloccata.
Questo tempo si chiama Lock timeout.
Per sapere l’impostazione del proprio database eseguire questo comando
db2 get db cfg for <DB_NAME> | grep Lock
esempio:
[dbtkadm@db2-10-5-0-7-sandbox ~]$ db2 get db cfg for TESTDB | grep Lock
Lock timeout (sec) (LOCKTIMEOUT) = 45
Lock timeout events (MON_LOCKTIMEOUT) = NONE
Lock wait events (MON_LOCKWAIT) = NONE
Lock wait event threshold (MON_LW_THRESH) = 5000000
Lock event notification level (MON_LCK_MSG_LVL) = 1