☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta Concorrência. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Concorrência. Mostrar todas as mensagens

quarta-feira, 2 de agosto de 2023

🗄️ ALAN TURING E O Db2 DOS AGENTES — QUANDO DUAS IAs ESTÃO CERTAS EM REALIDADES DIFERENTES

 

Bellacosa Mainframe concorrencia e questoes de dados quem é relevante

☕ UM CAFÉ NO BELLACOSA MAINFRAME

🗄️ ALAN TURING E O Db2 DOS AGENTES — QUANDO DUAS IAs ESTÃO CERTAS EM REALIDADES DIFERENTES

Db2, agentes de IA, COBOL, SQL, ACID, transações, isolamento, locks, MVCC, dirty read, non-repeatable read, phantom read, lost update, optimistic concurrency, timestamps, versionamento, commit, rollback, contexto, temporalidade, proveniência, RAG — e o dia em que Alan Turing descobriu que uma inteligência artificial pode estar absolutamente certa sobre uma realidade que deixou de existir três segundos atrás.



🎬 PRÓLOGO — AS DUAS INTELIGÊNCIAS ESTAVAM CERTAS

Alan Turing entrou no CPD.

Dois pequenos agentes estavam discutindo.

O primeiro gritava:

— O cliente possui R$ 10.000!

O segundo respondia:

— Não! Ele possui R$ 2.000!

Turing olhou para o programador COBOL.

— Qual deles está errado?

— Um dos dois, obviamente.

Turing tomou um gole de café.

— Tem certeza?

Na tela havia:

AGENT-A
READ TIME..... 10:00:01
BALANCE....... 10000.00

Na outra:

AGENT-B
READ TIME..... 10:00:04
BALANCE....... 2000.00

Entre as duas leituras:

10:00:03
WITHDRAWAL.... 8000.00
COMMIT........ OK

Silêncio.

O jovem programador coçou a barba imaginária que todo programador mainframe adquire depois de alguns anos.

Turing perguntou novamente:

— Qual inteligência artificial estava errada?

O pequeno robô respondeu:

— Nenhuma.

— Exatamente.

E escreveu no quadro:

DADOS NÃO EXISTEM FORA DO TEMPO.

A primeira lição daquele dia seria desagradavelmente simples:

Ler um dado não significa possuir a verdade. Significa possuir uma observação feita em determinado momento e sob determinadas condições.

Bem-vindo ao Db2 dos Agentes.



🗄️ CAPÍTULO 1 — O BANCO DE DADOS NÃO É UM ARMÁRIO

Para quem está começando em COBOL, é tentador imaginar banco de dados como um enorme armário.

Existe uma gaveta:

CUSTOMER

Dentro dela:

CUSTOMER_ID
NAME
BALANCE
STATUS
CREDIT_LIMIT

O programa pergunta:

SELECT BALANCE
FROM CUSTOMER
WHERE CUSTOMER_ID = 12345;

Db2 responde:

10000.00

Pronto.

Verdade encontrada.

Só que não.

Em um sistema corporativo real, enquanto você lê 10000.00, outras coisas podem estar acontecendo.

Um caixa eletrônico pode sacar dinheiro.

Uma API pode registrar pagamento.

Um programa COBOL pode alterar o limite.

Outro agente pode atualizar o cadastro.

Um batch pode consolidar movimentos.

Uma transação CICS pode estar executando naquele exato instante.

O banco de dados não é uma fotografia imóvel.

É uma cidade viva.



🧠 CAPÍTULO 2 — LER NÃO É COMPREENDER

Imagine que nosso agente recebe:

CUSTOMER_ID = 12345
BALANCE     = 10000

E conclui:

Cliente possui recursos suficientes para uma compra de R$ 8.000.

Matematicamente:

10000 >= 8000

Correto.

Mas talvez exista:

PENDING_PAYMENT = 5000

ou:

AVAILABLE_BALANCE = 3000

ou uma regra dizendo:

ACCOUNT_STATUS = BLOCKED

O dado isolado estava correto.

A interpretação estava incompleta.

Esse problema é enorme para agentes.

LLMs são extraordinariamente bons em transformar informações em linguagem e relações.

Mas não devemos confundir:

DADO

com:

SIGNIFICADO DO DADO.

Um agente corporativo precisa conhecer:

  • semântica;

  • origem;

  • unidade;

  • validade;

  • relacionamento;

  • regras de negócio;

  • temporalidade.

BALANCE = 10000 sem contexto pode ser praticamente inútil.



📚 CAPÍTULO 3 — O COPYBOOK JÁ TENTAVA NOS AVISAR

Programadores COBOL convivem com isso há décadas.

Veja:

01  WS-CUSTOMER.
    05 WS-CUSTOMER-ID       PIC 9(09).
    05 WS-BALANCE           PIC S9(11)V99 COMP-3.
    05 WS-STATUS            PIC X.

O layout explica a representação.

Mas ainda não explica completamente o significado.

O que significa:

WS-STATUS = 'B'

?

Blocked?

Bankrupt?

Business?

Batman?

😂

Sem documentação, regra de negócio ou conhecimento do sistema, temos apenas um byte.

É por isso que sistemas antigos frequentemente possuem algo valiosíssimo:

CONHECIMENTO SEMÂNTICO.

Está espalhado por:

copybooks
programas COBOL
DDL
stored procedures
documentação
regras
manuais
pessoas

Para um agente entender dados corporativos, não basta entregar tabelas.

Precisamos entregar contexto.



⏰ CAPÍTULO 4 — O DADO TEM IDADE

Turing escreve:

VALUE = 10000

Depois pergunta:

— Quando?

O programador responde:

— Como assim?

Turing acrescenta:

VALUE = 10000
READ_AT = 10:00:01

Agora temos algo muito mais interessante.

Porque:

10:00:01 → 10000
10:00:03 → withdrawal 8000
10:00:04 → 2000

O dado envelheceu em três segundos.

Chamaremos informalmente isso de:

DATA FRESHNESS.

Ou frescor do dado.

Para algumas informações:

3 segundos

é praticamente tempo real.

Para outras:

3 segundos

é perigosamente velho.

Temperatura média anual?

Sem problema.

Saldo bancário antes de autorizar pagamento?

Problema.


🕰️ CAPÍTULO 5 — TODA DECISÃO POSSUI UMA JANELA TEMPORAL

Nosso agente faz:

10:00:01 READ CUSTOMER
10:00:02 CALL LLM
10:00:04 SEARCH DOCUMENT
10:00:07 ANALYZE
10:00:09 DECIDE

Ele tomou uma decisão às:

10:00:09

baseado em informação obtida às:

10:00:01.

Temos oito segundos de diferença.

Em alguns processos isso é irrelevante.

Em outros é enorme.

Podemos imaginar:

DECISION AGE = DECISION_TIME - DATA_READ_TIME

Nesse caso:

8 segundos.

Uma arquitetura de agentes deveria perguntar:

Quanto tempo uma observação continua válida para esta decisão?

Isso é tão importante quanto o timeout discutido no CICS dos Agentes.


⚛️ CAPÍTULO 6 — ACID ENTRA NA SALA

Quando falamos de bancos transacionais, encontramos a famosa sigla:

ACID

Ela representa quatro propriedades conceituais:

A — Atomicity
C — Consistency
I — Isolation
D — Durability

Vamos traduzi-las para nosso pequeno robô.


⚛️ CAPÍTULO 7 — ATOMICIDADE: TUDO OU NADA

Imagine transferência:

Conta A: -100
Conta B: +100

Não queremos:

Conta A: -100
Conta B: ERROR

A unidade lógica precisa ser tratada de forma coerente.

Ou todas as alterações da unidade de trabalho são confirmadas, ou as alterações não confirmadas precisam ser revertidas conforme a transação e os recursos envolvidos.

Conceitualmente:

BEGIN

DEBIT A
CREDIT B

COMMIT

Se ocorrer problema:

ROLLBACK

Nosso agente precisa entender que ações relacionadas não podem ser tratadas como frases independentes de uma conversa.


🧭 CAPÍTULO 8 — CONSISTÊNCIA: NÃO QUEBRE AS REGRAS DO UNIVERSO

Consistência significa que as operações devem respeitar as regras e invariantes estabelecidas pelo sistema.

Por exemplo:

STOCK >= 0

ou:

ORDER must reference valid CUSTOMER

ou regras implementadas em aplicações, constraints, triggers e outros mecanismos.

O agente pode dizer:

Parece razoável.

Db2 responde:

Não perguntei se parece razoável.

😂

O sistema possui regras.

Inteligência probabilística não substitui integridade transacional.


🧱 CAPÍTULO 9 — ISOLAMENTO: AQUI COMEÇA A DIVERSÃO

Agora chegamos ao ponto central.

Imagine duas transações:

TX-A
TX-B

executando simultaneamente.

Queremos controlar o quanto uma transação pode perceber dos efeitos da outra enquanto ambas estão em andamento.

Isso é parte do problema de:

ISOLATION.

Sem isolamento adequado, concorrência pode produzir resultados surpreendentes.

E agentes multiplicam esse problema porque podemos ter:

10 agentes
100 agentes
1.000 agentes

tomando decisões simultaneamente.


💾 CAPÍTULO 10 — DURABILIDADE: COMMIT NÃO É PROMESSA DE BAR

Quando uma transação é confirmada com sucesso, esperamos que seu resultado persistente sobreviva conforme as garantias oferecidas pelo sistema.

Ou seja:

COMMIT

não deveria significar:

Acho que gravei.

Significa que a alteração alcançou o ponto de confirmação definido pelo sistema transacional.

Para agentes corporativos isso importa muito.

O agente precisa diferenciar:

PLANNED

de:

EXECUTED

e:

COMMITTED.

São estados diferentes.


👻 CAPÍTULO 11 — DIRTY READ: O FANTASMA QUE AINDA PODE DESAPARECER

Imagine:

TX-A:
UPDATE ACCOUNT
SET BALANCE = 2000

Mas ainda não houve commit.

Outra transação consegue observar essa alteração sob condições que permitam leitura não confirmada.

Depois A faz:

ROLLBACK.

A informação que B viu desapareceu.

B tomou decisão sobre algo que nunca se tornou estado confirmado.

É a ideia de:

DIRTY READ.

Para um agente, isso pode ser especialmente perigoso.

Ele pode gerar uma explicação brilhante baseada em uma alteração que será desfeita segundos depois.


🔁 CAPÍTULO 12 — NON-REPEATABLE READ: EU JURO QUE ERA 10.000

Agente A lê:

BALANCE = 10000

Agente B altera:

BALANCE = 2000
COMMIT

A lê novamente:

BALANCE = 2000

A mesma consulta lógica produziu valores diferentes durante a execução da atividade.

O pequeno robô olha para Turing:

— Professor, o banco mentiu para mim!

— Não.

— Mas mudou!

— Exatamente.

O mundo mudou.

Essa é uma distinção filosófica e técnica importante:

Mudança não é inconsistência.

Às vezes o sistema está funcionando perfeitamente.

A realidade simplesmente evoluiu.


👥 CAPÍTULO 13 — PHANTOM READ: APARECEU OUTRO CLIENTE

Imagine:

SELECT COUNT(*)
FROM ORDERS
WHERE STATUS = 'PENDING';

Resultado:

10

Outra transação insere novo pedido pendente.

Você executa novamente.

11

Apareceu uma nova linha que satisfaz o predicado da consulta.

O conjunto observado mudou.

É o tipo de fenômeno associado ao famoso:

PHANTOM.

Para agentes que fazem análises sobre conjuntos de dados, isso importa bastante.

O agente pode perguntar:

Quantas solicitações aguardam aprovação?

A resposta pode envelhecer antes de terminar a frase.


💥 CAPÍTULO 14 — LOST UPDATE: DOIS AGENTES ESTAVAM CERTOS

Temos:

STOCK = 10

Agent-A lê:

10

Agent-B lê:

10.

A decide vender 3.

Calcula:

10 - 3 = 7

B decide vender 4.

Calcula:

10 - 4 = 6.

A grava:

7

B grava:

6.

A atualização de A pode ser efetivamente perdida dependendo da forma como a aplicação implementa a concorrência.

O valor correto deveria refletir ambas as operações:

3.

Dois agentes.

Duas contas matematicamente corretas.

Resultado corporativo errado.

Esse é um dos melhores exemplos de por que:

INTELIGÊNCIA NÃO RESOLVE CONCORRÊNCIA.


🔒 CAPÍTULO 15 — LOCKS: RESERVANDO UM PEDAÇO DA REALIDADE

Uma abordagem tradicional para coordenar concorrência utiliza locks.

Simplificando:

AGENT-A
LOCK ROW

Agora B precisa esperar dependendo da operação, isolamento e mecanismos envolvidos.

A altera.

UPDATE
COMMIT

Lock liberado.

B continua.

Isso pode proteger consistência.

Mas lembra do CICS dos Agentes?

Locks possuem custo.

Se o agente fizer:

LOCK CUSTOMER

CALL LLM

SEARCH WEB

READ 50 PDFs

ASK HUMAN

WAIT 20 MINUTES

o DBA provavelmente surgirá atrás dele segurando um manual do Db2 como arma contundente.


☠️ CAPÍTULO 16 — NÃO PENSE SEGURANDO O LOCK

Nossa regra retorna:

NÃO DEIXE O LLM PENSAR SEGURANDO LOCKS DESNECESSÁRIOS.

Uma arquitetura possível:

READ
↓
CAPTURE VERSION
↓
RELEASE TRANSACTIONAL RESOURCES
↓
THINK
↓
REVALIDATE
↓
SHORT UPDATE TRANSACTION
↓
COMMIT

Mas agora aparece uma pergunta:

Como sabemos se o dado mudou enquanto o agente pensava?

Excelente.

Entramos no próximo monstro.


🔢 CAPÍTULO 17 — VERSIONAMENTO

Imagine tabela conceitual:

CUSTOMER
────────────────────────
ID          12345
BALANCE     10000
VERSION     17

O agente lê:

VERSION = 17.

Vai pensar.

Enquanto isso outra transação altera o registro.

Agora:

VERSION = 18.

Nosso agente retorna e tenta atualizar.

Em vez de simplesmente:

UPDATE CUSTOMER
SET CREDIT_LIMIT = 5000
WHERE CUSTOMER_ID = 12345;

podemos usar uma estratégia de concorrência otimista:

UPDATE CUSTOMER
SET CREDIT_LIMIT = 5000,
    VERSION = VERSION + 1
WHERE CUSTOMER_ID = 12345
  AND VERSION = 17;

Se:

ROWS UPDATED = 1

ótimo.

Se:

ROWS UPDATED = 0

alguma coisa mudou.

Pare.

Releia.

Reavalie.


optimistic CAPÍTULO 18 — OPTIMISTIC CONCURRENCY

O nome vem da ideia:

Provavelmente ninguém vai alterar isto enquanto estou trabalhando.

Em vez de manter um lock durante todo o raciocínio, registramos a versão observada.

Depois verificamos se ainda é a mesma.

Fluxo:

READ VERSION 17
      ↓
THINK
      ↓
CHECK VERSION
      ↓
   ┌───────┐
   │       │
  17      18
   │       │
   ▼       ▼
UPDATE   STALE
        RELOAD

Isso combina muito bem com agentes.

Por quê?

Porque raciocínio de IA pode levar tempo e envolver recursos externos.

Não queremos manter uma transação aberta durante todo esse período.


🥖 CAPÍTULO 19 — O PÃO DE QUEIJO DA CONCORRÊNCIA

Turing coloca um pão de queijo sobre a mesa.

Diz ao Agent-A:

— Quantos existem?

— Um.

Agent-A vira para consultar o LLM sobre a composição nutricional do pão de queijo.

Agent-B chega.

Come o pão de queijo.

Agent-A volta.

— Decidi com 98,7% de confiança que devo comer o pão de queijo.

Turing aponta para o prato vazio.

Agent-A:

ERROR:
RESOURCE NOT FOUND

😂

Essa é concorrência otimista explicada no café.

Você não precisa segurar o pão durante quinze minutos.

Mas antes de mordê-lo:

VERIFIQUE SE ELE AINDA EXISTE.


📸 CAPÍTULO 20 — SNAPSHOT: UMA FOTOGRAFIA DA REALIDADE

Às vezes queremos que uma operação trabalhe sobre uma visão consistente dos dados.

Conceitualmente, podemos imaginar:

SNAPSHOT @ 10:00:00

O agente analisa aquela visão.

Mesmo que o mundo continue mudando, sabemos:

Esta análise corresponde à realidade observada naquele ponto ou contexto transacional.

Isso é extremamente útil.

Mas exige honestidade.

O resultado deveria dizer algo como:

ANALYSIS-AS-OF:
2026-09-27T10:00:00

e não:

CURRENT STATE.

Se os dados eram de dez minutos atrás, não chame de “agora”.


🕰️ CAPÍTULO 21 — “AS OF” PODE SER TÃO IMPORTANTE QUANTO O VALOR

Imagine um relatório:

RISK SCORE = 72

Pergunta:

— Baseado em quê?

Resposta:

CUSTOMER DATA..... 10:00
PAYMENTS........... 09:58
CREDIT BUREAU...... 08:00
CRM................ yesterday

Agora entendemos muito melhor o resultado.

Para agentes, deveríamos considerar metadados como:

SOURCE
READ_AT
VALID_AT
VERSION
TRANSACTION_ID
RUN_ID

Isso cria:

PROVENIÊNCIA TEMPORAL.

Não basta saber de onde veio.

Precisamos saber de quando veio.


🤖 CAPÍTULO 22 — O RAG TAMBÉM POSSUI RELÓGIO

Agora chegamos a algo delicioso.

RAG:

Retrieval-Augmented Generation

Em termos simples:

PERGUNTA
↓
BUSCA INFORMAÇÃO
↓
ENTREGA CONTEXTO AO MODELO
↓
MODELO RESPONDE

Fantástico.

Mas imagine recuperar:

POLITICA-CREDITO-2024.PDF

quando existe:

POLITICA-CREDITO-2026.PDF.

O modelo pode interpretar perfeitamente o documento errado.

A resposta pode ser:

linguisticamente excelente
logicamente coerente
tecnicamente obsoleta.

Isso é assustador.


📚 CAPÍTULO 23 — EMBEDDING NÃO SABE QUE A NORMA FOI REVOGADA

Busca semântica responde:

Este documento é parecido com sua pergunta.

Ela não necessariamente responde:

Este documento continua válido hoje.

Essas são perguntas diferentes.

Um sistema RAG corporativo pode precisar considerar:

EFFECTIVE_FROM
EFFECTIVE_TO
VERSION
STATUS
SUPERSEDED_BY
SOURCE
AUTHORITY

Imagine:

DOC A
Similarity = 0.97
Status = EXPIRED

e:

DOC B
Similarity = 0.91
Status = ACTIVE.

Qual deveria ganhar?

Não necessariamente A.

A relevância semântica é apenas uma dimensão.


🧭 CAPÍTULO 24 — VERDADE TAMBÉM PRECISA DE PROVENIÊNCIA

Nosso agente afirma:

O limite do cliente é R$ 20.000.

Pergunte:

SOURCE?

Depois:

WHEN?

Depois:

VERSION?

Depois:

COMMITTED?

Depois:

AUTHORIZED SOURCE?

Uma resposta corporativa forte deveria conseguir produzir evidências.

Por exemplo:

VALUE......... 20000
SOURCE........ DB2.CUSTOMER_LIMIT
KEY........... 12345
READ_AT....... 10:42:03
VERSION....... 882
RUN-ID........ A004821

Agora temos algo auditável.


🪪 CAPÍTULO 25 — O RUN-ID ENCONTRA O DATA VERSION

No JES2 dos Agentes criamos:

RUN-ID.

Agora podemos relacionar:

RUN-ID A004821

com:

CUSTOMER VERSION 882
DOCUMENT VERSION 17
RULESET VERSION 42
MODEL VERSION X

Isso responde uma pergunta extremamente importante:

Qual realidade o agente viu quando tomou esta decisão?

Sem isso, uma auditoria futura pode encontrar dados diferentes e perguntar:

— Como a IA chegou nessa conclusão absurda?

Talvez não fosse absurda.

Talvez os dados fossem outros naquele momento.


🧪 CAPÍTULO 26 — REPRODUZIR UMA DECISÃO DE IA É MAIS DIFÍCIL

Com programa COBOL determinístico:

INPUT X
+
PROGRAM VERSION Y
=
OUTPUT Z

frequentemente temos comportamento bastante reproduzível.

Com agente:

PROMPT
MODEL
TOOLS
DATA
DOCUMENTS
TIMING
CONVERSATION
POLICY

todos podem influenciar.

Portanto registrar apenas:

PROMPT

não basta.

Podemos precisar registrar referências para:

RUN-ID
MODEL VERSION
PROMPT VERSION
TOOL VERSION
DATA VERSION
DOCUMENT VERSION
POLICY VERSION
TIMESTAMPS
RESULT

Isso é observabilidade encontrando governança de dados.

SDSF encontra Db2.


🔄 CAPÍTULO 27 — REVALIDATE BEFORE COMMIT

Aqui está uma regra poderosa.

Nosso agente:

READ
↓
THINK
↓
DECIDE

Antes de alterar algo importante:

REVALIDATE

Depois:

COMMIT.

Fluxo completo:

READ STATE V17
      ↓
ANALYZE
      ↓
PROPOSE ACTION
      ↓
CHECK CURRENT STATE
      ↓
V17?
 │
 ├─ YES → EXECUTE → COMMIT
 │
 └─ NO  → RELOAD → REASON AGAIN

Essa talvez seja uma das regras mais importantes de todo o artigo.

NÃO CONFIE CEGAMENTE NO SNAPSHOT QUE INICIOU O RACIOCÍNIO.


👤 CAPÍTULO 28 — HUMAN-IN-THE-LOOP PIORA O PROBLEMA TEMPORAL

Imagine:

10:00
Agent recommends payment

Humano recebe:

Approve?

Vai almoçar.

Volta:

13:30

Clica:

APPROVE.

O agente não deveria simplesmente continuar a operação planejada três horas e meia atrás.

Precisa:

RELOAD
REVALIDATE
REAUTHORIZE
EXECUTE

Talvez o saldo mudou.

Talvez o cliente foi bloqueado.

Talvez a regra mudou.

Talvez outro operador já resolveu.

A aprovação humana confirma intenção.

Não necessariamente confirma que o estado antigo continua válido.


🚨 CAPÍTULO 29 — STALE CONTEXT

Vamos dar nome ao monstro:

STALE CONTEXT.

O contexto ficou velho.

Exemplo:

AGENT CONTEXT
CUSTOMER_STATUS = ACTIVE
READ_AT = 10:00

Agora:

CURRENT DATABASE
CUSTOMER_STATUS = BLOCKED
UPDATED_AT = 10:03.

Às 10:05 o agente ainda carrega:

ACTIVE.

Isso não é hallucination.

Não é necessariamente erro do LLM.

É contexto obsoleto.

Essa distinção é importantíssima.


🧯 CAPÍTULO 30 — NEM TODO ERRO DE IA É ERRO DA IA

Quando um agente produz resposta incorreta, investigue:

MODEL?
PROMPT?
RETRIEVAL?
DATA?
TIMING?
TOOL?
CACHE?
VERSION?

Talvez o modelo tenha raciocinado corretamente sobre dados ruins.

Talvez os dados fossem bons, mas velhos.

Talvez a ferramenta tenha retornado cache.

Talvez a consulta tenha usado uma réplica com defasagem.

Talvez o documento recuperado estivesse revogado.

“IA errou” pode ser diagnóstico preguiçoso.

Precisamos descobrir:

EM QUAL CAMADA A REALIDADE SE DESVIOU?


🗃️ CAPÍTULO 31 — CACHE É UMA MÁQUINA DO TEMPO

Cache melhora desempenho.

No CICS dos Agentes adoramos isso.

Em vez de consultar Db2:

20 ms

podemos obter:

2 ms.

Fantástico.

Mas existe preço.

O dado pode estar:

STALE.

Imagine:

CACHE TTL = 5 minutes

Para:

COUNTRY CODE

talvez ótimo.

Para:

AVAILABLE BALANCE

talvez terrível.

Portanto:

Cache não é simplesmente performance. É uma decisão sobre quanto passado aceitamos apresentar como presente.


🎯 CAPÍTULO 32 — FRESHNESS BUDGET

No CICS tínhamos:

LATENCY BUDGET.

Agora podemos imaginar:

FRESHNESS BUDGET.

Por exemplo:

PRODUCT DESCRIPTION..... 24h
CUSTOMER ADDRESS........ 5m
ACCOUNT BALANCE......... 1s
FRAUD STATUS............ 0s / revalidate

Não são números universais.

São decisões de negócio e arquitetura.

Mas o conceito é poderoso:

Quão velho este dado pode estar antes de deixar de ser aceitável?


📊 CAPÍTULO 33 — O PAINEL DO Db2 DOS AGENTES

Imagine nosso painel operacional:

RUN-ID......... A004821
AGENT.......... CREDIT-ANALYSIS

DATA SOURCES
────────────────────────────────────────
CUSTOMER        VERSION 882    AGE 0.4s
BALANCE         VERSION 991    AGE 0.1s
CRM             VERSION 441    AGE 2m
CREDIT-RULES    VERSION 42     AGE 3d
RAG-DOC         VERSION 17     AGE 4h

DECISION AGE.................. 2.8s
STALE SOURCES................. 0
OPEN TRANSACTION.............. NO
LOCKS HELD.................... 0
REVALIDATION REQUIRED......... YES

Agora estamos falando.

O operador consegue enxergar não apenas:

O QUE O AGENTE ESTÁ FAZENDO?

mas:

QUAL REALIDADE ELE ESTÁ VENDO?

🧰 CAPÍTULO 34 — CHECKLIST PARA AGENTES QUE TOMAM DECISÕES SOBRE DADOS

Antes de colocar um agente corporativo em produção, pergunte:

1. Qual é a fonte oficial?

Db2?
API?
RAG?
cache?

2. O dado possui timestamp?

Saiba quando foi observado.

3. Existe versão?

Use versionamento quando necessário.

4. Qual é o freshness budget?

Defina tolerância.

5. O agente mantém transação aberta enquanto pensa?

Evite.

6. Existem locks?

Minimize duração.

7. Pode haver concorrência?

Presuma que sim.

8. Existe optimistic concurrency?

Considere version checking.

9. A ação precisa ser revalidada?

Para ações críticas, quase certamente.

10. O RAG conhece validade documental?

Não use apenas similaridade.

11. Existe proveniência?

Registre origem.

12. Podemos reconstruir a decisão?

Associe dados, versões e RUN-ID.

13. O humano pode demorar para aprovar?

Revalide depois da aprovação.

14. O cache é permitido?

Defina TTL de acordo com semântica.

15. O resultado informa “as of”?

Quando relevante, deveria.


🥚 EASTER EGG — O AGENTE QUE ESTAVA 100% CERTO

02:14 da madrugada.

Telefone toca.

— Produção.

O operador atende.

— Temos problema.

— Qual?

— A IA aprovou uma operação que deveria ter recusado.

Abrem o trace.

RUN-ID A008817

Modelo respondeu corretamente.

Prompt correto.

Regra correta.

RACF correto.

Nenhuma hallucination.

Turing chega carregando café.

— Mostre os dados.

CUSTOMER_STATUS = ACTIVE

— Quando foram lidos?

Silêncio.

Procuram.

CACHE READ:
01:43:02

Turing olha o relógio.

02:14.

Consulta Db2:

CUSTOMER_STATUS = BLOCKED
UPDATE TIME     = 01:44:11

O agente estava usando uma informação de 31 minutos atrás.

O jovem programador diz:

— Então a IA errou.

Turing responde:

— Não.

Aponta para o cache.

— Nós entregamos o passado e perguntamos sobre o presente.

Silêncio.

No fundo do CPD, o DBA sorri.

Finalmente não era culpa do banco.


🧬 CAPÍTULO 35 — NOSSO MAINFRAME DOS AGENTES ESTÁ FICANDO INTERESSANTE

Agora nossa arquitetura conceitual possui:

RACF
↓
QUEM PODE?
PF3
↓
POSSO PARAR?
SDSF
↓
O QUE ESTÁ FAZENDO?
MAXCC
↓
FUNCIONOU?
WLM
↓
QUEM RECEBE RECURSOS?
JES2
↓
QUEM COMEÇA E QUANDO?
CICS
↓
QUANTO TEMPO O HUMANO PODE ESPERAR?

E agora:

Db2
↓
QUAL REALIDADE O AGENTE ESTÁ VENDO?

Isso muda tudo.


🏰 CAPÍTULO 36 — O SISTEMA OPERACIONAL CONCEITUAL DOS AGENTES

Turing desenha novamente:

                     HUMANO
                        │
                        ▼
                 ┌─────────────┐
                 │   REQUEST   │
                 └──────┬──────┘
                        │
               ┌────────┴────────┐
               │                 │
               ▼                 ▼
             CICS               JES2
         responda agora      trabalhe depois
               │                 │
               └────────┬────────┘
                        ▼
                       WLM
                        │
                       RACF
                        │
                        ▼
                      AGENT
                        │
           ┌────────────┼────────────┐
           ▼            ▼            ▼
          LLM          Db2          TOOLS
                        │
                        ▼
               CURRENT REALITY?

Ao redor:

SDSF
OBSERVE

CHECKPOINT
RESUME

PF3
STOP

MAXCC
VERIFY

RUN-ID
IDENTIFY

VERSION
VALIDATE

TIMESTAMP
WHEN?

O mainframe não está apenas nos ensinando como executar agentes.

Está nos ensinando a fazê-los sobreviver à realidade corporativa.


👴 CAPÍTULO 37 — O PROGRAMADOR COBOL JÁ VIU ESSE FILME

O mundo de IA está descobrindo:

agents
tool calls
state
concurrency
context
workflow

O programador COBOL olha e pensa:

Vocês descobriram processamento corporativo.

😂

Porque ele já viveu:

CICS
Db2
JES2
MQ
RACF
WLM
COMMIT
ROLLBACK
LOCK
RESTART

Claro que agentes introduzem problemas novos.

Modelos probabilísticos.

Context windows.

Embeddings.

RAG.

Tool selection.

Autonomia.

Mas muitos monstros operacionais são antigos.

E nós já temos cicatrizes deles.


☕ EPÍLOGO — QUAL REALIDADE VOCÊ ESTÁ VENDO?

Fim da tarde.

O pequeno agente recebe:

CUSTOMER_ID = 12345

Consulta:

BALANCE = 10000
VERSION = 882
READ_AT = 17:42:01

Começa análise.

Enquanto pensa:

17:42:02
WITHDRAWAL = 8000
COMMIT
VERSION = 883

O agente termina:

17:42:04

Antigamente responderia:

Operação aprovada. O cliente possui R$ 10.000.

Mas agora aprendeu.

Antes de agir:

CHECK VERSION 882

Db2 responde:

CURRENT VERSION = 883.

O robô para.

Relê.

BALANCE = 2000.

Reavalia.

Resultado:

DECISION = DENIED
REASON   = INSUFFICIENT FUNDS

Turing sorri.

— Muito bem.

O agente pergunta:

— Minha primeira análise estava errada?

Turing responde:

— Não.

— Então por que não usei?

— Porque ela estava correta para uma realidade que não existia mais.

O programador COBOL olha para o terminal.

Na tela:

RUN-ID........ A004821

READ VERSION.. 882
CURRENT....... 883

CONTEXT....... STALE
REVALIDATION.. REQUIRED

ACTION........ REEVALUATED
STATUS........ COMMITTED

Turing termina o café.

Antes de sair, escreve no quadro:

UMA IA NÃO PRECISA APENAS SABER A RESPOSTA.

Abaixo:

PRECISA SABER DE QUANDO É A RESPOSTA.

E finalmente:

SELECT
    VALUE,
    VERSION,
    TIMESTAMP
FROM
    REALITY
WHERE
    NOW = NOW;

O programador observa.

— Professor...

— Sim?

— Essa tabela não existe.

Turing sorri.

— Ainda.

No fundo do CPD, o DBA grita:

— E NEM INVENTA DE CRIAR EM PRODUÇÃO!

O pequeno robô fecha o terminal.

COMMIT;

E todos foram tomar café.

Porque no mainframe, no Db2 e no mundo dos agentes, existe uma verdade que sobrevive a qualquer geração tecnológica:

Uma decisão só é tão confiável quanto os dados, o contexto e o instante da realidade sobre os quais ela foi construída.

READY

☕ UM CAFÉ NO BELLACOSA MAINFRAME

🤖 Alan Turing entra no CPD

O mapa dos agentes de IA explicado por um mainframer

Esta série acompanha a evolução de uma ideia: compreender os problemas modernos dos agentes de inteligência artificial usando conceitos conhecidos por quem trabalha com mainframe, IBM Z e sistemas corporativos.

A viagem começa pelas pessoas e pela experiência de uso, passa por observabilidade, priorização e execução, chega às transações, estado e mensageria e termina na organização hierárquica do contexto.

01
FEV / 2023

🧠 O currículo invisível da inteligência artificial

Antes de construir agentes inteligentes precisamos preparar as pessoas que trabalharão com eles. Técnica, pensamento crítico, conhecimento de negócio, segurança, ética e responsabilidade formam o currículo que nem sempre aparece no certificado.

02
MAR / 2023

🤖 A UX dos agentes

Quando uma IA deixa de apenas responder e começa a executar ações, sua interface precisa mostrar objetivos, progresso, permissões e resultados. PF3, MAXCC e RACF tornam-se excelentes analogias para controle, retorno e privilégio mínimo.

04
MAI / 2023

⚖️ O WLM dos agentes

CPU, GPU, tokens, APIs e bancos de dados são recursos finitos. O Workload Manager inspira uma discussão sobre prioridades, objetivos de serviço, importância do trabalho e distribuição dinâmica de recursos entre agentes.

06
JUL / 2023

⚡ O CICS dos agentes

Uma coisa é uma IA produzir texto. Outra é permitir que ela execute operações reais de negócio. CICS introduz a conversa sobre processamento transacional, concorrência, segurança e integridade.

07
AGO / 2023

🗄️ O Db2 dos agentes

Agentes precisam manter estado, checkpoints, decisões e resultados. O Db2 fornece o ponto de partida para discutir unidade de trabalho, consistência, COMMIT, ROLLBACK e recuperação.

10
SET / 2026

☕ Alan Turing entra no CPD — O mapa completo

O artigo-âncora reúne toda a evolução da ideia: pessoas, UX, observabilidade, prioridade, orquestração, transações, estado, mensageria e contexto transformam artigos independentes em uma arquitetura conceitual para agentes de IA.

🖥️ Leitor da série

Selecione qualquer capítulo acima para abri-lo normalmente. O painel abaixo é apenas um recurso adicional de navegação.

segunda-feira, 3 de junho de 2019

🐒 Detetive Chimp e o Mistério do Banco de Dados que Jurava Ser Consistente

 

Bellacosa Mainframe apresenta DBMS

☕ Um Café no Bellacosa Mainframe

🐒 Detetive Chimp e o Mistério do Banco de Dados que Jurava Ser Consistente

DBMS, modelagem ER, SQL, normalização, índices, ACID, locks, concorrência, COMMIT, ROLLBACK e recovery investigados por um detetive que sabe que os dados sempre deixam pistas



Há uma coisa que aprendi observando sistemas durante muito tempo: quando um programa diz que “não fez nada”, comece procurando o log.

Quando um usuário afirma que “clicou apenas uma vez”, procure duas transações.

Quando uma aplicação garante que “ninguém alterou aquele registro”, procure um UPDATE.

E quando um banco de dados afirma que está tudo consistente...

...chame o Detetive Chimp.

Nosso investigador chega ao data center usando seu tradicional chapéu, examina o terminal 3270 e encontra a primeira pista:

03:17:00.001  TRANSACTION T1
03:17:00.003  TRANSACTION T2

Dois milissegundos.

Uma diferença ridiculamente pequena para um humano.

Uma eternidade para um computador.

Sobre a mesa há ainda cinco folhas intituladas DBMS Quick Revision Sheet. Elas falam de DBMS, ER Model, SQL, normalização, ACID, transações, concorrência e índices.

Chimp olha para aquilo.

— Interessante.

Acende seu cachimbo imaginário.

— Temos vários suspeitos.

E assim começa nosso caso.



🕵️ CAPÍTULO 1 — O cadáver era um banco de dados

Antes de investigar o crime precisamos entender a vítima.

DBMS significa:

Database Management System — Sistema Gerenciador de Banco de Dados.

Para o iniciante, é tentador pensar:

banco de dados = lugar onde guardamos informações.

Não está errado.

Mas é tão incompleto quanto dizer que um aeroporto é um lugar onde estacionamos aviões.

Um DBMS precisa armazenar, organizar, localizar, proteger, compartilhar, alterar e recuperar dados, além de arbitrar o que acontece quando diversos usuários tentam mexer neles simultaneamente.

Imagine:

              USUÁRIOS
                 │
                 ▼
          ┌─────────────┐
          │ APLICAÇÕES  │
          └──────┬──────┘
                 │
                 ▼
          ┌─────────────┐
          │    DBMS     │
          └──────┬──────┘
                 │
                 ▼
          ┌─────────────┐
          │    DADOS    │
          └─────────────┘

O DBMS fica entre as aplicações e os dados.

Mas Detetive Chimp imediatamente acrescentaria vários departamentos escondidos naquele retângulo:

                  DBMS
                    │
       ┌────────────┼─────────────┐
       │            │             │
     SQL        Segurança     Transações
       │            │             │
   Optimizer     Controle      Logging
       │                          │
   Access Path                  Recovery
       │
     Storage

É uma pequena cidade funcionando atrás de uma palavra de quatro letras.



🐒 CAPÍTULO 2 — O primeiro suspeito: SQL

Chimp encontra uma consulta:

SELECT NOME, LIMITE
FROM CLIENTE
WHERE CPF = :WS-CPF;

— Parece inocente.

O programador COBOL iniciante concorda.

Chimp continua:

— É exatamente por isso que devemos investigá-la.

SQL é uma linguagem declarativa.

Quando escrevemos:

SELECT NOME
FROM CLIENTE
WHERE CPF = '123';

estamos essencialmente dizendo:

“Db2, quero o nome do cliente cujo CPF é 123.”

Não estamos necessariamente dizendo:

“vá até determinado cilindro, encontre determinada página, leia o registro número 427...”

O DBMS precisa descobrir uma estratégia eficiente.

Simplificando:

SQL
 │
 ▼
PARSER
 │
 ▼
OPTIMIZER
 │
 ▼
ACCESS PATH
 │
 ├── INDEX?
 │
 ├── SCAN?
 │
 └── JOIN?
 │
 ▼
DADOS

Aqui aparece um personagem que aquelas folhas introdutórias mal conseguem explorar: o optimizer.

Ele analisa possibilidades para executar a consulta.

Portanto, duas consultas SQL que produzem resultados semelhantes podem apresentar comportamentos de performance radicalmente diferentes.

Saber escrever SQL é uma habilidade.

Entender como o banco chega aos dados é outra.



🧩 CAPÍTULO 3 — Antes do banco havia o mundo real

Chimp desenha três objetos no quadro:

CLIENTE
CONTA
TRANSAÇÃO

Antes de existir tabela, índice ou SELECT, alguém precisou transformar uma realidade de negócio em um modelo de dados.

É aí que entra o ER Model — Entity Relationship Model.

Temos três conceitos fundamentais:

ENTITY
ATTRIBUTE
RELATIONSHIP

Uma entidade pode ser:

CLIENTE

Seus atributos:

ID_CLIENTE
CPF
NOME
DATA_NASCIMENTO

Outra entidade:

CONTA

Com:

ID_CONTA
AGENCIA
SALDO

Existe então uma relação:

CLIENTE ───── POSSUI ───── CONTA

Um cliente pode possuir várias contas.

Podemos representar:

CLIENTE 1 ───────── N CONTA

Chimp bate o cachimbo no quadro.

— Eis uma pista importante: muitos crimes de dados começam antes de existir código.

Um modelo ruim acaba contaminando tabelas, programas, APIs, relatórios e integrações.



🔑 CAPÍTULO 4 — O caso das chaves desaparecidas

A apostila apresenta:

Super Key, Candidate Key, Primary Key, Alternate Key e Foreign Key.

Parece matéria de prova.

Não é.

Imagine:

CLIENTE
-----------------------
ID_CLIENTE
CPF
NOME

Escolhemos:

ID_CLIENTE → PRIMARY KEY

Outra tabela:

CONTA
-----------------------
ID_CONTA
ID_CLIENTE
SALDO

Aqui:

ID_CONTA   → PRIMARY KEY
ID_CLIENTE → FOREIGN KEY

Agora existe uma relação:

CLIENTE
 ID_CLIENTE
     │
     │
     ▼
CONTA
 ID_CLIENTE

A chave estrangeira representa uma relação entre os dados.

Sem integridade adequada poderíamos encontrar:

CONTA 999999
CLIENTE 777777

mas descobrir que:

CLIENTE 777777

não existe.

Chimp imediatamente pergunta:

— Então de quem é essa conta?

Silêncio no data center.

Temos um órfão de dados.


🧹 CAPÍTULO 5 — Normalização: arrumando a cena do crime

Agora encontramos uma tabela criada por alguém numa sexta-feira às 17:58:

PEDIDO
---------------------------------
CLIENTE
ENDERECO
PRODUTO1
PRECO1
PRODUTO2
PRECO2
PRODUTO3
PRECO3

Chimp olha horrorizado.

— Quem fez isso?

Ninguém responde.

Naturalmente.

A normalização procura organizar estruturas de dados reduzindo redundâncias e dependências problemáticas.

A apostila percorre:

1NF
 ↓
2NF
 ↓
3NF
 ↓
BCNF

Uma modelagem mais organizada poderia resultar em:

CLIENTE
   │
   │
   ▼
PEDIDO
   │
   │
   ▼
ITEM_PEDIDO
   │
   │
   ▼
PRODUTO

Isso reduz problemas clássicos de:

INSERT
UPDATE
DELETE

Imagine armazenarmos o endereço do cliente repetidamente em 30 mil pedidos.

Ele muda de endereço.

Quantas ocorrências precisam ser alteradas?

Esse tipo de redundância é terreno fértil para inconsistência.

Mas Chimp deixa uma observação importante no relatório:

Normalização é ferramenta de engenharia, não religião.

Projetos reais também consideram performance, padrões de acesso, volume, frequência de atualização e características específicas do workload.


🏦 CAPÍTULO 6 — Finalmente encontramos o dinheiro

Agora o caso fica sério.

Temos:

CONTA A = R$ 1.000
CONTA B = R$   500

Queremos transferir:

R$ 100

Conceitualmente:

A = A - 100
B = B + 100

Depois:

A = 900
B = 600

Perfeito.

Um programa COBOL poderia executar uma sequência equivalente a:

LER A
SUBTRAIR 100
UPDATE A

LER B
SOMAR 100
UPDATE B

Mas Chimp coloca uma banana exatamente entre os dois updates.

UPDATE A
   │
   ▼
A = 900

💥 ABEND S0C7

UPDATE B
   │
   X

Agora temos:

A = 900
B = 500

Os R$100 desapareceram.

Não foram transferidos.

Foram sacrificados aos deuses do processamento de dados.

É aqui que surge um dos conceitos mais importantes de toda a apostila:

TRANSACTION


🔄 CAPÍTULO 7 — A transação é o verdadeiro suspeito

Uma transação representa uma unidade lógica de trabalho.

Queremos que:

DEBITAR A
CREDITAR B

sejam tratados como parte de uma operação coerente.

Conceitualmente:

┌──── UNIT OF WORK ─────┐
│                       │
│ UPDATE A              │
│ UPDATE B              │
│                       │
│ COMMIT                │
│                       │
└───────────────────────┘

Se tudo funcionar:

COMMIT

Se alguma coisa der errado antes da confirmação apropriada:

ROLLBACK

Chimp sorri.

— Agora encontramos o mecanismo que impede o dinheiro de desaparecer.

Mas ainda não resolvemos o crime.

Porque existem outros usuários.


🧪 CAPÍTULO 8 — ACID entra para interrogatório

Na parede aparecem quatro letras:

A C I D

Não é uma banda psicodélica de mainframe.

São propriedades fundamentais das transações.

A — Atomicity

Tudo ou nada.

A - 100
B + 100

Não queremos:

A - 100 ✓
B + 100 ✗

A operação lógica deve ser tratada atomicamente.


C — Consistency

Antes:

A = 1000
B = 500

TOTAL = 1500

Depois:

A = 900
B = 600

TOTAL = 1500

O sistema deve preservar as regras de consistência definidas para os dados.

Mas cuidado: consistência não significa que o DBMS magicamente conhece todas as regras do negócio.

Se uma regra diz:

clientes menores de determinada idade não podem contratar determinado produto,

alguém precisa expressar e implementar essa regra adequadamente.

O banco não consulta uma bola de cristal.


I — Isolation

Chimp finalmente encontra a pista decisiva.

Temos limite disponível:

R$ 1.000

Duas compras chegam:

T1 → R$700
T2 → R$600

Quase simultaneamente.

T1 pergunta:

LIMITE?

Resposta:

1000

T2 pergunta:

LIMITE?

Resposta:

1000

T1 pensa:

700 < 1000

APROVADO

T2 pensa:

600 < 1000

APROVADO

Resultado:

700 + 600 = 1300

Oops.

É por isso que concorrência não é detalhe acadêmico.


D — Durability

Depois que uma transação é confirmada, esperamos que sua alteração sobreviva a falhas previstas pelo mecanismo transacional.

Não queremos:

COMMIT

e cinco minutos depois:

“Desculpe, perdemos sua transferência.”

Logging e recovery existem justamente porque computadores, discos, processos e aplicações podem falhar.


🔐 CAPÍTULO 9 — As impressões digitais chamadas LOCKS

A apostila apresenta dois conceitos:

S LOCK
X LOCK

Simplificando didaticamente:

Shared Lock permite compartilhamento compatível para determinados acessos de leitura.

Exclusive Lock protege recursos que estão sendo modificados contra acessos incompatíveis.

Chimp desenha:

TRANSACTION A
     │
     ▼
   RESOURCE
     ▲
     │
TRANSACTION B

Agora temos concorrência.

Um sistema empresarial não pode simplesmente dizer:

“Só uma pessoa pode usar o banco por vez.”

Imagine um banco com milhões de clientes operando assim.

CLIENTE 1 → terminou?
CLIENTE 2 → pode entrar.
CLIENTE 3 → espere.
CLIENTE 4 → senha 493827.

😂

Precisamos permitir enorme paralelismo enquanto preservamos integridade.

Esse é um dos grandes desafios do DBMS.


💀 CAPÍTULO 10 — Deadlock: encontramos dois cadáveres

Chimp encontra:

T1 possui LOCK A
T2 possui LOCK B

Depois:

T1 precisa de B
T2 precisa de A

Visualmente:

       espera
   ┌──────────────►
   │
  T1              T2
   ▲               │
   ◄───────────────┘
       espera

Parabéns.

Criamos um deadlock.

T1 espera T2.

T2 espera T1.

Nenhum resolve voluntariamente a situação.

O DBMS precisa detectar e solucionar esse tipo de conflito, normalmente escolhendo uma transação como vítima para quebrar o ciclo.

E aí o programador descobre uma lição maravilhosa:

ROLLBACK não significa necessariamente que o DBMS está quebrado.

Às vezes o rollback é justamente o mecanismo impedindo que o sistema permaneça preso.


🚦 CAPÍTULO 11 — Isolation Level: quanta privacidade você quer?

Aqui começamos a sair definitivamente da apostila de revisão e entrar na engenharia.

No Db2 encontramos níveis como:

UR
CS
RS
RR

Conceitualmente podemos imaginar um controle:

MAIS ISOLAMENTO
      ▲
      │
      │ proteção
      │
      │
      │ concorrência
      ▼
MENOS ISOLAMENTO

Isso não significa simplesmente:

“mais isolamento é melhor.”

Um sistema transacional gigantesco precisa equilibrar:

integridade
concorrência
latência
throughput
CPU
locks
tempo de resposta

O programador que escolhe mecanismos de isolamento sem entender o workload está fazendo engenharia com os olhos vendados.


💾 CAPÍTULO 12 — SAVEPOINT, a máquina do tempo

Chimp encontra:

SAVEPOINT SP1

— Finalmente uma testemunha inteligente.

Imagine:

PASSO A
PASSO B
PASSO C

SAVEPOINT SP1

PASSO D
PASSO E
PASSO F

O passo F falha.

Dependendo da situação e do desenho da aplicação, podemos voltar a um savepoint apropriado:

A ✓
B ✓
C ✓

--- SP1 ---

D ↶
E ↶
F ↶

É quase um:

SAVE GAME

do processamento transacional.

Só não diga isso durante entrevista para DBA.

Ou diga.

Talvez ele goste.


🔎 CAPÍTULO 13 — O índice não matou ninguém... provavelmente

Chimp encontra uma tabela gigantesca:

CLIENTE
100.000.000 ROWS

Consulta:

SELECT NOME
FROM CLIENTE
WHERE CPF = :CPF;

Como encontramos aquele CPF?

Sem uma estrutura de acesso adequada, poderíamos ter um trabalho enorme de procura.

Com um índice apropriado:

CPF
 │
 ▼
INDEX
 │
 ▼
LOCALIZAÇÃO
 │
 ▼
DADO

Muito melhor.

Então surge a ideia perigosa:

“Vamos criar índice para tudo!”

Chimp imediatamente fecha o notebook.

— Não.

Índices também possuem custo.

Precisam ser armazenados e mantidos quando dados são inseridos, removidos ou alterados.

Temos novamente um compromisso:

MAIS ÍNDICES
     │
     ├── potencial de melhores acessos
     │
     └── maior custo de manutenção/espaço

Banco de dados é uma sucessão de decisões de engenharia.


🧠 CAPÍTULO 14 — O verdadeiro cérebro estava escondido: Optimizer

Finalmente encontramos o personagem que faltava nas folhas.

O programador escreve:

SELECT ...
FROM CLIENTE C
JOIN CONTA A
  ON C.ID_CLIENTE = A.ID_CLIENTE
WHERE C.CPF = :CPF;

O DBMS precisa descobrir como executar aquilo.

Conceitualmente:

SQL
 │
 ▼
OPTIMIZER
 │
 ├── estatísticas
 ├── cardinalidade
 ├── índices
 ├── predicates
 ├── joins
 └── estimativas
 │
 ▼
ACCESS PATH

É por isso que:

SQL correto

não implica necessariamente:

SQL eficiente

Ele pode retornar exatamente os dados solicitados e ainda assim fazer um trabalho absurdamente maior do que o necessário.

Chimp escreve no relatório:

O suspeito tinha álibi funcional, mas não tinha álibi de performance.


🏭 CAPÍTULO 15 — Agora tragam CICS, COBOL e Db2

Chegamos ao Bellacosa Mainframe.

Coloque tudo junto:

                    CLIENTE
                       │
                       ▼
                ┌────────────┐
                │    CICS    │
                └─────┬──────┘
                      │
                      ▼
                ┌────────────┐
                │   COBOL    │
                └─────┬──────┘
                      │
                     SQL
                      │
                      ▼
                ┌────────────┐
                │Db2 for z/OS│
                └─────┬──────┘
                      │
            ┌─────────┴─────────┐
            ▼                   ▼
          INDEX                DATA

Agora multiplique por milhares de transações.

T000001
T000002
T000003
...
T999999

Todas querem:

READ
INSERT
UPDATE
DELETE
COMMIT

O problema deixa de ser:

“Como salvo um cliente?”

Passa a ser:

Como milhares de operações podem alterar um universo compartilhado simultaneamente sem destruir sua coerência?

Essa pergunta explica boa parte da existência dos mecanismos transacionais.


💳 CAPÍTULO 16 — Chimp investiga uma compra de cartão

Compra:

R$100

A mensagem chega ao sistema.

             COMPRA
                │
                ▼
              CICS
                │
                ▼
              COBOL
                │
       ┌────────┼─────────┐
       ▼        ▼         ▼
    CLIENTE   CARTÃO    PRODUTO
       │        │         │
       └────────┼─────────┘
                ▼
              LIMITE
                │
                ▼
             FRAUDE?
                │
                ▼
          AUTORIZAÇÃO
                │
         ┌──────┴──────┐
         ▼             ▼
      APPROVE        DECLINE

Parece simples.

Agora chegam duas compras:

03:17:00.001 → R$700
03:17:00.003 → R$600

Limite:

R$1000

Eis o easter egg.

03:17.

Chimp olha para o relógio.

— Sempre é 03:17 quando algo interessante acontece no mainframe.

Dois milissegundos separam um fluxo trivial de um excelente caso de concorrência.

Agora fazem sentido:

ACID
LOCK
ISOLATION
COMMIT
ROLLBACK
LOG
RECOVERY

Cada palavra da apostila ganhou consequências financeiras.


🧯 CAPÍTULO 17 — “Mas funcionou no teste!”

Chimp fecha os olhos.

Essa é uma das frases favoritas do culpado.

No teste:

1 usuário
1 transação
100 registros

Produção:

10.000 usuários
milhares de transações
milhões/bilhões de registros
concorrência
timeout
deadlock
falhas
rede
batch
online
APIs

O programa:

SELECT
UPDATE
COMMIT

funciona maravilhosamente sozinho.

Coloque centenas de instâncias disputando os mesmos recursos e você descobrirá características que nunca apareceram no teste simplificado.

É por isso que engenharia transacional exige pensar não apenas:

MEU PROGRAMA

mas:

              SISTEMA
                 │
     ┌───────────┼───────────┐
     ▼           ▼           ▼
  ONLINE       BATCH        APIs
     │           │           │
     └───────────┼───────────┘
                 ▼
                DB2

Seu programa nunca está realmente sozinho.


🐒 CAPÍTULO 18 — Detetive Chimp apresenta os suspeitos

Depois de horas investigando, Chimp monta o quadro:

              O CASO DBMS
                   │
       ┌───────────┼────────────┐
       ▼           ▼            ▼
    MODELAGEM     SQL       TRANSAÇÃO
       │           │            │
       ▼           ▼            ▼
      ER       OPTIMIZER       ACID
       │           │            │
       ▼           ▼            ▼
     KEYS       INDEXES      LOCKING
       │                        │
       ▼                        ▼
 NORMALIZATION              ISOLATION
                                │
                       ┌────────┴────────┐
                       ▼                 ▼
                    COMMIT           ROLLBACK
                       │                 │
                       └────────┬────────┘
                                ▼
                              LOG
                                │
                                ▼
                            RECOVERY

Nenhum deles isoladamente matou o banco.

O problema estava na interação entre todos eles.


🎓 CAPÍTULO 19 — A trilha para o programador COBOL iniciante

Se eu transformasse aquelas cinco folhas em uma trilha de estudo, seguiria esta ordem:

  1. Entenda DBMS e a diferença entre dado, banco e gerenciador. Depois modele entidades, atributos, relacionamentos, cardinalidades e chaves. Aprenda SQL básico — SELECT, INSERT, UPDATE, DELETE e JOIN — e só então entre em normalização e integridade referencial.

  2. Em seguida estude transações profundamente: Unit of Work, COMMIT, ROLLBACK, SAVEPOINT e ACID. Depois avance para concorrência, locks, isolamento, timeout e deadlock. Finalmente estude índices, optimizer, access paths, logging, backup/recovery e performance.

  3. Só então faça o exercício realmente divertido: implemente mentalmente tudo isso em COBOL + CICS + Db2, primeiro com um usuário e depois imaginando 10.000 usuários concorrentes.

Nesse ponto o estudante deixa de decorar definições e começa a pensar como engenheiro.


☕ EPÍLOGO — O banco nunca mentiu

O sol começa a nascer sobre o data center.

Chimp termina seu café.

O jovem programador pergunta:

— Então quem era o assassino?

Chimp coloca o chapéu.

— Ninguém.

— Como assim?

— O banco fez exatamente aquilo que mandaram fazer.

Silêncio.

Essa talvez seja uma das maiores lições de sistemas.

Computadores são extraordinariamente obedientes.

Se você modelar mal, eles executarão rapidamente um modelo ruim.

Se escrever uma transação incorreta, executarão corretamente a transação incorreta.

Se criar SQL ineficiente, poderão produzir exatamente o resultado esperado — lentamente.

Se esquecer concorrência, o sistema poderá funcionar perfeitamente durante meses...

...até duas transações chegarem juntas.

03:17:00.001
03:17:00.003

E então você descobrirá que dois milissegundos podem revelar um erro arquitetural escondido durante anos.

Chimp deixa sobre a mesa as cinco folhas de revisão.

No começo da investigação elas diziam:

DBMS
ER MODEL
NORMALIZATION
SQL
ACID
TRANSACTION
INDEX

Agora significam:

REALIDADE
   ↓
MODELAGEM
   ↓
DADOS
   ↓
TRANSAÇÕES
   ↓
CONCORRÊNCIA
   ↓
INTEGRIDADE
   ↓
RECUPERAÇÃO
   ↓
PERFORMANCE
   ↓
NEGÓCIO

É essa a diferença entre decorar banco de dados para uma prova e compreender por que bancos, seguradoras, companhias aéreas, governos e sistemas de cartões investem tanto em engenharia transacional.

Aquelas quatro letras — ACID — parecem matéria de apostila.

Um COMMIT parece apenas um comando.

Um LOCK parece detalhe técnico.

Um índice parece somente uma maneira de procurar dados mais rapidamente.

Até o dia em que você percebe que do outro lado daqueles registros existem dinheiro, passagens, pedidos, pagamentos, estoques, contratos e pessoas.

Detetive Chimp abre a porta.

Antes de sair, olha novamente para o terminal.

READY

Caso encerrado?

Claro que não.

Em mainframe sempre existe outro JOB esperando na fila.

E provavelmente existe algum programador jurando:

“Mas eu não alterei nada...”

Chimp sorri.

Procure o log. 🐒🔎☕



quinta-feira, 13 de dezembro de 2018

O Caso do Registro que Não Podia Ser Tocando : Quando um Jovem Programador COBOL Descobriu que Dois Usuários Podiam Roubar Dinheiro Sem Serem Ladrões

 

Bellacosa Mainframe e o caso do registro que nao podia ser tocando

☕ Um Café no Bellacosa Mainframe

O Caso do Registro que Não Podia Ser Tocando

Quando um Jovem Programador COBOL Descobriu que Dois Usuários Podiam Roubar Dinheiro Sem Serem Ladrões

"Existem crimes que deixam impressões digitais. Outros deixam apenas inconsistências no VSAM."


A chuva caía sobre o Centro de Processamento de Dados.

As luzes verdes do IBM Z piscavam lentamente, como se respirassem na escuridão.

Era quase meia-noite.

No monitor 3270, uma única mensagem chamava a atenção do jovem programador COBOL.

RESP = 14

Nenhum ABEND.

Nenhum dump.

Nenhum S0C7.

Nenhum S0C4.

Apenas um simples código de retorno.

Mas, como todo bom investigador sabe, às vezes o menor detalhe esconde o maior dos mistérios.

Foi então que o velho administrador de CICS aproximou-se segurando uma caneca de café.

Sem olhar para o monitor, apenas perguntou:

— Você tentou fazer REWRITE sem entender quem estava segurando a chave do cofre?

O rapaz respondeu:

— Eu só queria alterar um telefone...

O veterano sorriu.

— É exatamente assim que começam todos os grandes mistérios do CICS.

Hoje vamos investigar um dos mecanismos mais importantes de toda a arquitetura CICS: READ UPDATE e REWRITE, dois comandos aparentemente simples, mas responsáveis por proteger bilhões de registros VSAM diariamente em bancos, seguradoras, bolsas de valores, companhias aéreas e órgãos governamentais.

Prepare seu café.

Acenda a luminária verde da mesa.

Porque esta investigação vai muito além de um simples comando COBOL.


O verdadeiro problema nunca foi gravar um registro

Todo programador iniciante pensa assim:

"Quero alterar um cliente."

Então imagina algo parecido com:

Ler

↓

Modificar

↓

Gravar

Parece simples.

E realmente seria...

...se apenas uma pessoa utilizasse o sistema.

Mas o CICS nasceu para outro mundo.

Um mundo onde milhares de pessoas utilizam o mesmo arquivo ao mesmo tempo.

Imagine um banco.

Enquanto você lê este artigo...

Milhares de clientes estão:

  • pagando boletos;

  • transferindo PIX;

  • alterando endereço;

  • consultando saldo;

  • contratando empréstimos;

  • desbloqueando cartão.

Tudo isso pode atingir exatamente o mesmo registro VSAM.

Agora surge a pergunta que assombra arquitetos desde os anos 1970:

Quem ganha quando duas pessoas querem alterar o mesmo registro ao mesmo tempo?


O nascimento do maior vilão dos sistemas online

Seu nome é:

Lost Update

Ele não gera ABEND.

Não trava o CICS.

Não derruba o sistema.

Pior.

Ele produz dados errados.

Imagine o seguinte registro.

Cliente

Saldo

R$ 1.000,00

Agora entram dois caixas.

Caixa A deposita:

+R$ 100,00

Caixa B faz um saque.

-R$ 200,00

Os dois executam:

READ

Ambos recebem:

R$ 1.000,00

Caixa A calcula:

1.100

Grava.

Logo depois...

Caixa B calcula:

800

Também grava.

Resultado final:

R$ 800,00

Mas espere.

O correto seria:

R$ 900,00

Onde desapareceram os R$ 100,00?

Ninguém roubou.

Ninguém fraudou.

Nenhum operador errou.

Foi apenas um clássico caso de Lost Update, um problema de concorrência em que uma atualização sobrescreve a outra por ambas terem partido de uma mesma versão antiga do registro.

É exatamente para impedir esse tipo de situação que o CICS criou um dos mecanismos mais elegantes da computação transacional.


A filosofia do READ UPDATE

Muitos iniciantes acreditam que UPDATE significa:

"Atualize o registro."

Na verdade...

Não.

O UPDATE não grava absolutamente nada.

Ele apenas comunica ao CICS:

"Vou precisar modificar este registro. Reserve-o para mim."

É quase como chegar à biblioteca e colocar um marcador sobre um livro dizendo:

"Estou usando."

Enquanto esse marcador existir...

Ninguém mais pode pegar aquele livro.

No CICS acontece exatamente isso.

EXEC CICS READ
     FILE('CLIENTE')
     RIDFLD(WS-CHAVE)
     INTO(WS-REGISTRO)
     UPDATE
END-EXEC

Observe.

Não houve alteração alguma.

O registro continua exatamente igual.

A única diferença é invisível.

Agora existe um cadeado.

Registro Cliente

──────────────

Saldo

Telefone

Endereço

──────────────

🔒

Esse pequeno cadeado é um dos maiores responsáveis pela confiabilidade dos sistemas bancários modernos.


O cadeado invisível

Esse bloqueio é chamado de lock exclusivo.

Enquanto ele existir:

✔ outro programa pode consultar outros registros;

✔ outras transações continuam funcionando normalmente;

✔ outros clientes continuam utilizando o banco.

Mas aquele registro...

Aquele especificamente...

Pertence temporariamente à sua transação.

É como um investigador isolando a cena do crime.

Até que a perícia termine...

Ninguém entra.


O segundo investigador chega

Imagine agora.

Programa A faz:

READ UPDATE

Registro bloqueado.

Cinco milissegundos depois...

Programa B também tenta atualizar o mesmo cliente.

READ UPDATE

O que acontece?

O CICS responde algo semelhante a:

RESP = 14

Registro bloqueado.

Dependendo da configuração da aplicação, a segunda transação poderá:

  • aguardar a liberação do lock;

  • receber imediatamente a indicação de bloqueio;

  • ou seguir outra estratégia definida pelo sistema.

Perceba a genialidade.

O CICS prefere atrasar uma operação por alguns milissegundos a permitir corrupção dos dados.


REWRITE: a hora da verdade

Depois de alterar a Working-Storage...

Chega o momento mais importante.

EXEC CICS REWRITE
     FILE('CLIENTE')
     FROM(WS-REG)
END-EXEC

Agora sim.

O VSAM grava novamente o registro.

Muitos iniciantes perguntam:

"Ele grava somente o telefone?"

Não.

O REWRITE grava o registro inteiro.

Mesmo que apenas um campo tenha mudado.

Imagine um cadastro.

Nome

CPF

Telefone

Cidade

Saldo

Limite

Nascimento

Endereço

Estado Civil

Você modifica somente:

Telefone

Mesmo assim...

Todo o registro volta ao disco.

Isso acontece porque o VSAM trabalha com registros completos, e o REWRITE substitui a imagem inteira do registro originalmente lido.


O segredo da chave imutável

Existe uma regra quase sagrada.

O REWRITE mantém a mesma chave do registro.

Você pode alterar:

  • telefone;

  • saldo;

  • limite;

  • endereço;

  • e-mail;

  • profissão.

Mas não pode alterar a chave primária.

Se precisar mudar a chave...

O caminho normalmente envolve excluir o registro antigo e gravar outro com a nova chave.

É uma mudança de identidade.

E identidades novas exigem um novo registro.


A importância do COMMIT

Um detalhe frequentemente esquecido pelos iniciantes é imaginar que o REWRITE já libera o registro.

Nem sempre.

Enquanto a unidade lógica de trabalho não termina, o lock pode continuar ativo.

É por isso que o fluxo clássico é:

READ UPDATE

↓

Modificar memória

↓

REWRITE

↓

SYNCPOINT (COMMIT)

↓

Lock liberado

O COMMIT confirma a alteração e encerra aquela etapa da transação.

Se ocorrer um erro antes disso, o sistema pode desfazer a operação, preservando a consistência dos dados.


O perigo dos formulários longos

Imagine esta situação.

Você faz:

READ UPDATE

Depois envia uma tela.

O usuário vai atender o telefone.

Conversar.

Tomar café.

Voltar vinte minutos depois.

Só então pressiona ENTER.

Durante todo esse tempo...

O registro permaneceu bloqueado.

Resultado?

Filas.

Esperas.

Outros usuários impedidos de alterar aquele mesmo cliente.

Por isso existe uma regra de ouro no desenvolvimento CICS:

Nunca mantenha um lock por mais tempo do que o estritamente necessário.

Uma estratégia comum é:

  1. Fazer um READ simples para exibir os dados.

  2. Receber as alterações do usuário.

  3. Executar um READ UPDATE pouco antes da gravação.

  4. Validar novamente.

  5. Fazer o REWRITE.

  6. Finalizar a unidade de trabalho.

Assim, o bloqueio dura apenas alguns milissegundos.


RESP e RESP2: os investigadores silenciosos

Nunca ignore os códigos de retorno.

Um programa robusto verifica cuidadosamente o resultado de cada comando CICS.

Alguns exemplos comuns:

RESPSignificado
00Operação realizada com sucesso
02Registro não encontrado
14Registro bloqueado
20Arquivo ou recurso não encontrado
30Requisição inválida
91Atualização não concluída; investigar a causa

Quando disponível, RESP2 complementa o diagnóstico, fornecendo informações adicionais específicas sobre a condição encontrada.

Um bom programador COBOL não apenas trata o erro; ele entende por que ele ocorreu.


Curiosidade: por que não existe UPDATE como no SQL?

Quem vem do mundo relacional estranha.

No SQL basta escrever:

UPDATE CLIENTE
SET TELEFONE = '11999999999'
WHERE ID = 100;

No VSAM, a lógica é diferente.

Primeiro você obtém o registro.

Depois altera sua cópia em memória.

Só então grava o registro inteiro novamente.

Essa diferença vem da própria natureza do VSAM, que trabalha com registros físicos completos, enquanto o banco de dados relacional manipula colunas e linhas sob um mecanismo diferente de armazenamento.


Curiosidade histórica

Os conceitos por trás de READ UPDATE e REWRITE surgiram muito antes da popularização da internet.

Décadas antes de existirem smartphones, APIs REST ou microsserviços, grandes bancos já processavam milhões de transações simultâneas graças a mecanismos sofisticados de bloqueio, sincronização e recuperação.

Grande parte dessas ideias continua válida até hoje.

Muitas tecnologias modernas reinventaram princípios que os mainframes já utilizavam há décadas.


Passo a passo para atualizar um registro com segurança

Um fluxo típico em uma aplicação COBOL/CICS pode ser resumido assim:

  1. Receber a chave do registro.

  2. Executar READ UPDATE.

  3. Verificar RESP e, quando aplicável, RESP2.

  4. Alterar apenas os campos necessários na Working-Storage.

  5. Executar REWRITE.

  6. Confirmar a unidade lógica de trabalho (SYNCPOINT) ou realizar rollback em caso de falha.

  7. Encerrar a transação.

Parece simples.

E realmente é.

A dificuldade não está na sequência.

Está em compreender por que ela existe.


Dicas de ouro para quem está aprendendo CICS

✔ Nunca execute REWRITE sem um READ UPDATE bem-sucedido.

✔ Mantenha o tempo de bloqueio o menor possível.

✔ Sempre trate RESP e RESP2.

✔ Não altere a chave do registro antes do REWRITE.

✔ Pense em concorrência desde o primeiro programa que escrever.

✔ Lembre-se de que o usuário nunca está sozinho no sistema.

✔ Teste cenários com duas transações tentando atualizar o mesmo registro.

Esses testes ensinam mais sobre CICS do que centenas de exemplos puramente teóricos.


Easter Egg Bellacosa Mainframe 🕵️

Os veteranos do CPD contam uma velha história.

Durante uma madrugada de processamento, um programador jurava que o VSAM "perdia dinheiro".

Após horas analisando dumps, SMF e logs do CICS, nada parecia explicar o problema.

Foi então que um analista aposentado, conhecido apenas como O Guardião do 3270, pediu para ver apenas uma linha do código.

Ali estava:

EXEC CICS READ

Sem a palavra:

UPDATE

O veterano fechou o terminal, tomou um gole de café e disse:

— "O culpado nunca foi o VSAM. O registro estava falando com duas pessoas ao mesmo tempo."

Dizem que, desde então, quem programa CICS nas madrugadas presta mais atenção aos quatro caracteres que mudam completamente o destino de uma transação:

UPDATE


O verdadeiro mistério nunca esteve no REWRITE

Ao final desta investigação, descobrimos que o REWRITE não é o protagonista.

Ele apenas grava o resultado.

O verdadeiro herói é o READ UPDATE, que protege o registro enquanto a alteração está sendo preparada.

É ele quem impede que duas transações sobrescrevam o trabalho uma da outra.

É ele quem preserva a integridade dos dados.

É ele quem garante que milhões de operações bancárias possam acontecer simultaneamente com segurança.

Na superfície, parecem apenas dois comandos COBOL.

Nas sombras do CPD, porém, eles são os guardiões silenciosos da consistência, da concorrência e da confiança que sustentam alguns dos sistemas mais críticos do planeta.

E, como em toda boa revista noir dos anos 1950, o maior mistério nunca foi quem escreveu o código.

Foi descobrir quem estava segurando a chave do cofre quando ninguém mais podia tocá-lo.


Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...