sexta-feira, 25 de março de 2011

Isolation level de um statement pelo db2pd

Essa semana, testando uma nova versão de uma aplicação da empresa, surgiu a dúvida se um merge (antes executado com um Isolation level CS por default), poderia ser executado como UR ( Uncommited Read ). 


Descobrimos que sim, e, para nos dar a resposta definitiva em tempo de execução, usamos o db2pd.


Para quem não sabe, o db2pd é uma ferramenta usada para throubleshooting no db2, pois ela retorna rapidamente informações (falando de uma forma informal) do que está acontecendo no SGBD, desde uso do bufferpool, tablespaces a coisas relativas a rotinas administrativas, como runstats, reorgs e etc. Existe um amplo material sobre ele no Infocenter.


Bom, vamos parar de conversa e vamos começar a brincadeira.

$ db2 connect to sample
  Database Connection Information
  Database server        = DB2/LINUX 9.5.5
  SQL authorization ID   = DB2INST1
  Local database alias   = SAMPLE

Vamos executar o comando db2pd com os parâmetros necessários:

db2pd -db sample -dynamic


Joguei o output em um arquivo e procurei o MERGE do convdeskps( o merge foi alterado e coloquei nome de colunas e tabelas fakes ) :

Dynamic SQL Statements:

Address                       AnchID     StmtUID    NumEnv     NumVar     NumRef     NumExe     Text
0x00002AAD8D6768C0        78     4490601    1                1               2619         2619           MERGE INTO
    T AS I USING (SELECT C1, C2, C3, C4, C5 FROM Z ) INDATA ( C1, C2, C3, C4, C5, C6 ) ON (I.C1 = INDATA.C1 AND I.C2 = C2 AND I.C3 = INDATA.C4) WHEN MATCHED THEN UPDATE SET C3 = INDATA.C3, C4 = INDATA.C4, C5 = INDATA.C5 WHEN NOT MATCHED THEN INSERT (C1, C2, C3, C4, C5) VALUES ( INDATA.C1, INDATA.C2, INDATA.C3, INDATA.C4, INDATA.C5, INDATA.C6) WITH UR


Depois disso, a partir do StmtUUID [ 4490601 ] , procurei na seção Dynamic SQL Environments

Dynamic SQL Environments:
Address                        AnchID   StmtUID    EnvID    Iso    QOpt  Blk
0x00002AAD8D676D40 78           4490601    1            UR     5       B


Em negrito está o nível de isolamento do statement: UR

Sendo assim, realmente o DB2 está executando isso em Uncommited Read.