Scoprire chi tiene bloccato un oggetto

Rivista il

Accedi per salvare

Il modo diretto, da riga comandi:

WRKOBJLCK OBJ(PRODLIB/ARTICOLI) OBJTYPE(*FILE)

Lo stesso in SQL, utile quando serve raccogliere il dato in un programma o guardare più oggetti insieme:

SELECT JOB_NAME, LOCK_STATE, LOCK_STATUS, LOCK_SCOPE
  FROM QSYS2.OBJECT_LOCK_INFO
 WHERE SYSTEM_OBJECT_SCHEMA = 'PRODLIB'
   AND SYSTEM_OBJECT_NAME   = 'ARTICOLI'

Per i membri di un file database il lock può essere sul singolo membro:

WRKOBJLCK OBJ(PRODLIB/ARTICOLI) OBJTYPE(*FILE) MBR(*ALL)

Esempio: il salvataggio che fallisce alle due di notte

SAVLIB termina con un oggetto non salvato perché qualcuno lo teneva aperto. La mattina dopo il lock non c'è più (chi lo teneva ha chiuso la sessione) e WRKOBJLCK non serve a niente: mostra la situazione di adesso, non quella di stanotte.

La query invece si può lasciare nel CL del salvataggio, sotto il MONMSG, e scatta nel momento esatto in cui il lock c'è ancora. Prima la tabella, creata dalla query stessa perché nomi e tipi arrivino dalla vista:

CREATE TABLE MIALIB/DIAGLCK AS (
  SELECT CURRENT TIMESTAMP AS RILEVATO, SYSTEM_OBJECT_NAME,
         JOB_NAME, LOCK_STATE
    FROM QSYS2.OBJECT_LOCK_INFO
) WITH NO DATA

Poi il salvataggio:

SAVLIB LIB(PRODLIB) DEV(TAP01)
MONMSG MSGID(CPF3771) EXEC(DO)
  RUNSQL SQL('INSERT INTO MIALIB/DIAGLCK                            +
              SELECT CURRENT TIMESTAMP, SYSTEM_OBJECT_NAME,         +
                     JOB_NAME, LOCK_STATE                           +
                FROM QSYS2.OBJECT_LOCK_INFO                         +
               WHERE SYSTEM_OBJECT_SCHEMA = ''PRODLIB''') COMMIT(*NONE)
  MONMSG MSGID(CPF0000)
ENDDO

CPF3771 è il messaggio di SAVLIB per «oggetti salvati, altri non salvati». Dopo tre notti la tabella dice se è sempre lo stesso job (allora è un programma da sistemare) o se sono utenti diversi ogni volta, e allora il problema è l'orario del salvataggio. Per gli oggetti in uso SAVLIB ha anche il parametro SAVACT, il salvataggio mentre il sistema è attivo: senza, IBM avverte che un oggetto in uso non viene salvato.

Nota

un lock tenuto da una sessione interattiva può essere una schermata lasciata aperta su un record. Prima di terminare il job conviene chiedere a chi lo usa: ENDJOB interrompe quello che stava facendo.


Rilasci. WRKOBJLCK c'è su qualunque rilascio. La vista QSYS2.OBJECT_LOCK_INFO è più recente: se manca, la query risponde SQL0204 e resta il comando, che dà la stessa informazione a schermo.

Fonti

← Torna al blog

Commenti

Nessun commento ancora. Sii il primo a commentare!

Devi avere un account per commentare. Accedi · Registrati