Translate

Mostrar mensagens com a etiqueta deadlock. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta deadlock. Mostrar todas as mensagens

domingo, 18 de janeiro de 2026

💣 DB2 Troubleshotting

Bellacosa Mainframe Db2 Troubleshotting

💣 DB2 Troubleshotting

💣 1. DEADLOCK — “o abraço da morte”

🧪 Cenário real

Transação A:

UPDATE CLIENTES SET NOME='ANA' WHERE ID=1;

Transação B:

UPDATE CLIENTES SET NOME='JOAO' WHERE ID=2;

👉 Depois:

  • A tenta atualizar ID=2
  • B tenta atualizar ID=1

💥 BOOM → deadlock


🧠 O que aconteceu?

Cada transação:

  • segura um lock
  • espera o lock da outra

👉 Db2 detecta e mata uma delas


💥 Sintoma clássico

SQLCODE = -911
REASON CODE = 00C90088

🔍 Diagnóstico

  • IFCID 172 (trace)
  • DISPLAY DATABASE LOCKS
  • Monitoramento (OMEGAMON)

🛠️ Soluções

✔ Acessar tabelas sempre na mesma ordem
✔ Reduzir tempo de transação
✔ Usar COMMIT mais frequente
✔ Evitar “holding locks” por muito tempo

💡 Regra de ouro:

Ordem consistente = evita deadlock


⚠️ 2. LOCK ESCALATION — “quando o Db2 perde a paciência”

🧪 Cenário real

Você roda:

UPDATE CLIENTES SET STATUS='A';

👉 Sem WHERE 😬


🧠 O que acontece?

  • Começa com row locks
  • Muitos locks acumulam
  • Db2 sobe para table lock

💥 Resultado:

Ninguém mais acessa a tabela


💥 Sintoma

  • Lentidão geral
  • Jobs travados
  • Reclamação do usuário 😅

🔍 Diagnóstico

  • IFCID 196
  • Monitoramento de locks
  • DSNZPARM (NUMLKTS / NUMLKUS)

🛠️ Soluções

✔ Sempre usar WHERE
✔ Commit em blocos (batch)
✔ Ajustar parâmetros de lock
✔ Usar LOCKSIZE adequado

💡 Bellacosa insight:

UPDATE sem WHERE é pedido formal de incidente 🚨


🚀 3. ACCESS PATH — “o plano invisível que decide tudo”

🧪 Cenário real

SELECT * FROM CLIENTES WHERE ID = 1;

👉 Parece simples… mas:

  • Usa índice? ⚡
  • Ou faz table scan? 🐢

🧠 O que é Access Path?

👉 Caminho que o otimizador escolhe para acessar os dados


🔍 Como ver?

EXPLAIN PLAN FOR
SELECT * FROM CLIENTES WHERE ID = 1;

👉 Consulta tabela PLAN_TABLE


💥 Possibilidades

TipoImpacto
Index scanRápido ⚡
Table scanLento 🐢
Nested loopBom
SortCusto extra

🛠️ Otimização

✔ Criar índice correto
✔ Atualizar RUNSTATS
✔ Evitar SELECT *
✔ Filtrar bem no WHERE


💡 Exemplo prático

❌ Ruim:

SELECT * FROM CLIENTES;

✅ Melhor:

SELECT NOME FROM CLIENTES WHERE ID = 1;

🧠 VISÃO DE PRODUÇÃO (OURO!)

🔥 Deadlock

👉 Problema de concorrência


🔥 Lock escalation

👉 Problema de volume de locks


🔥 Access path

👉 Problema de performance


💣 CHECKLIST RÁPIDO (salva carreira)

Antes de subir para produção:

✔ Tem índice?
✔ Tem WHERE?
✔ Tem COMMIT?
✔ Rodou EXPLAIN?
✔ RUNSTATS atualizado?


😎 FRASES DE SENIOR (pra usar na daily)

  • “Isso tá com cara de access path ruim”
  • “Provavelmente lock escalation”
  • “Vamos revisar o EXPLAIN antes de mexer”
  • “Isso aí vai dar -911 em produção”