☕ 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 aciD. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta aciD. Mostrar todas as mensagens

domingo, 7 de dezembro de 2025

💥 O SISTEMA QUE NUNCA PODE PARAR: CICS TS no IBM z17 e o Segredo das Transações que Movem o Mundo

 

Bellacosa Mainframe explorando o CICS TS

💥 O SISTEMA QUE NUNCA PODE PARAR: CICS TS no IBM z17 e o Segredo das Transações que Movem o Mundo

Se você é um dev COBOL sênior e ainda escuta que seu código é “legado”… já passou da hora de virar o jogo.

Porque a verdade é outra:

💎 Você trabalha na plataforma que move bancos, governos e bilhões de transações por dia — o CICS Transaction Server rodando em IBM Z (como o z17).

Este artigo não é básico.
É uma visão de quem quer entender de verdade o coração do processamento transacional.


🏛️ Um pouco de história (e um choque de realidade)

CICS nasceu nos anos 60.

Sim… mais antigo que muita linguagem moderna.

Mas aqui está o plot twist:

👉 Ele nunca parou de evoluir.

Hoje o CICS:

  • Fala REST/JSON
  • Roda Java e Node.js
  • Integra com cloud
  • Expõe APIs
  • Suporta milhões de usuários simultâneos

Enquanto muita tecnologia “moderna” luta para resolver problemas que o CICS resolve há décadas.


⚡ O que é CICS TS (sem romantizar)

💎 CICS é um Transaction Processing Monitor (TP Monitor)

Traduzindo:

👉 Um sistema que garante que operações críticas aconteçam com segurança, velocidade e consistência.


🧠 O papel real do CICS

Ele é responsável por:

  • Executar programas (COBOL, Java, etc.)
  • Gerenciar milhares de usuários simultâneos
  • Controlar acesso a dados
  • Garantir integridade (ACID)
  • Coordenar commits e rollbacks
  • Recuperar falhas automaticamente

👉 Você escreve lógica de negócio.
👉 O CICS garante que ela não quebre o mundo.


💳 O conceito mais importante: TRANSAÇÃO

Uma transação é:

💎 Uma unidade lógica de trabalho que deve ser executada completamente ou não executada


🏦 Exemplo clássico (mas real)

Transferência de R$ 1.000:

  1. Debitar conta A
  2. Creditar conta B

Simples? Só na superfície.


💥 Se algo falhar no meio?

Sem CICS:

❌ Dinheiro some
❌ Sistema inconsistente

Com CICS:

👉 Tudo é desfeito (rollback)


⚖️ ACID no CICS — onde o jogo fica sério

🔹 Atomicidade

Tudo ou nada.

🔹 Consistência

Regras nunca são violadas.

🔹 Isolamento

Concorrência controlada.

🔹 Durabilidade

Após commit → permanente.


💡 Easter egg profissional:

“CICS não garante que sua transação vai terminar.
Ele garante que seu sistema nunca ficará inconsistente.”


🧩 Transaction vs Task vs Unit of Work (o trio que derruba entrevistas)

🏷️ Transaction

O pedido (ex: TRANSFERIR)

🧑‍💻 Task

A execução real para um usuário

🧩 Unit of Work

O conjunto de operações que devem ser concluídas juntas


🧠 Forma de lembrar

👉 Transaction = intenção
👉 Task = execução
👉 UOW = integridade


🔄 Passo a passo de uma transação CICS

Vamos simular algo real:

💳 Compra com cartão

1️⃣ Request chega (API, terminal, app)

2️⃣ CICS cria uma TASK

3️⃣ Programa COBOL é carregado

4️⃣ Locks são aplicados

5️⃣ DB2/VSAM são acessados

6️⃣ Logs são gravados

7️⃣ Syncpoint (commit ou rollback)

8️⃣ Resposta enviada

Tudo isso em milissegundos.


🔒 Concorrência — onde o CICS brilha

Milhões de usuários simultâneos?

Sem problema.


⚡ Multitasking

👉 Várias tasks rodando ao mesmo tempo


🧵 Multithreading

👉 Mesmo programa sendo usado por vários usuários


💎 Reentrância

👉 Código único + dados isolados

Sem isso, o mainframe colapsaria.


💥 Deadlock — quando o sistema entra em “briga”

🧠 Cenário clássico

Transação A segura recurso X e quer Y
Transação B segura Y e quer X

👉 Impasse total


🧯 Solução do CICS

  • Detecta o deadlock
  • Cancela uma transação
  • Libera recursos
  • Preserva integridade

💡 Curiosidade:

Deadlock não é erro — é efeito natural da concorrência.


🏗️ CICS como “SO dentro do SO”

Você não chama o z/OS diretamente.

Você chama o CICS:

EXEC CICS READ FILE(...)
EXEC CICS WRITEQ TS(...)
EXEC CICS LINK PROGRAM(...)

👉 O CICS fala com o sistema por você.


🌐 CICS moderno — muito além do 3270

Se você ainda pensa em tela verde, está atrasado.

Hoje o CICS:

  • Expõe APIs REST via z/OS Connect
  • Roda Java (Liberty JVM)
  • Executa Node.js
  • Integra com cloud
  • Participa de arquiteturas híbridas

📱 Exemplo real moderno

App mobile → API → z/OS Connect → CICS → DB2

Usuário nem imagina que existe um mainframe ali.


☁️ Cloud + CICS

Sim, isso existe.

CICS hoje suporta:

  • Bundles de aplicação
  • Deploy automatizado
  • Políticas de recursos
  • CICSPlex para escala

👉 Conceitos de cloud dentro do mainframe.


🧠 Curiosidades que poucos sabem

💡 CICS pode processar milhões de transações por segundo
💡 Muitos bancos nunca desligam CICS (uptime absurdo)
💡 Grande parte das transações financeiras globais passam por CICS
💡 Node.js roda dentro do CICS (sim, JavaScript no mainframe 😄)
💡 Seu COBOL pode virar API REST sem reescrever nada


🔥 Insight final (nível arquiteto)

💎 CICS não é legado — é infraestrutura invisível da economia mundial

Ele resolve problemas que arquiteturas modernas ainda tentam resolver:

  • Consistência forte
  • Alta concorrência
  • Recuperação automática
  • Baixa latência
  • Escala absurda

🚀 Conclusão — para dev COBOL sênior

Se você domina CICS:

👉 Você não é “dev legado”
👉 Você é especialista em sistemas de missão crítica

sexta-feira, 16 de agosto de 2024

House M.D., COBOL e o Caso do Banco de Dados que se Recusava a Esquecer: Datomic versus Db2 na Sala de Diagnóstico

 

Bellacosa Mainframe e a comparacao entre datomic e db2

☕ Um Café no Bellacosa Mainframe

House M.D., COBOL e o Caso do Banco de Dados que se Recusava a Esquecer: Datomic versus Db2 na Sala de Diagnóstico

🩺 SQL contra Datalog, UPDATE contra imutabilidade, buffer pools contra caches, logs contra história nativa, scale-up contra scale-out, décadas de cicatrizes contra arquitetura funcional — e a pergunta que ninguém deveria responder com religião tecnológica: “qual deles eu usaria para guardar o dinheiro?”

House entra na sala.

Olha para o quadro.

De um lado:

IBM Db2

Do outro:

Datomic

Foreman pergunta:

— Qual é o diagnóstico?

House apoia a bengala na mesa.

— Um deles tem quase meio século de experiência em ambientes corporativos. O outro nasceu em 2012 de um cara que achava que mudar estado demais era uma péssima ideia.

Cameron:

— Então Db2 ganha?

House:

— Você não entendeu nada.

Chase:

— Datomic ganha?

House:

— Você também não.

Ele olha para todos.

— Banco de dados não é concurso de popularidade. É diagnóstico diferencial.

E aí começa nossa consulta.

Porque comparar Datomic com Db2 apenas perguntando “qual é melhor?” é como perguntar se um bisturi é melhor que uma ressonância magnética.

Depende do problema.

Depende do paciente.

Depende do risco.

E, principalmente:

depende do que você está tentando preservar, consultar, transacionar e recuperar quando tudo der errado às 03h17 da manhã.

Pegue o café.

Hoje vamos abrir o paciente.


1. Primeiro sintoma: ambos guardam dados, mas pensam diferente

Db2 nasceu dentro da tradição relacional.

Você pensa em:

TABLE
ROW
COLUMN
PRIMARY KEY
FOREIGN KEY
INDEX
SQL

Exemplo:

CREATE TABLE CONTA (
    ID        CHAR(10) NOT NULL,
    TITULAR   VARCHAR(100),
    SALDO     DECIMAL(15,2),
    PRIMARY KEY (ID)
);

Depois:

SELECT SALDO
FROM CONTA
WHERE ID = '000123';

Simples.

Familiar.

Décadas de ferramentas, otimizadores, DBAs, utilities, backups, logs, reorgs, statistics, access paths e trauma acumulado.

Datomic pensa diferente.

Ele enxerga fatos.

Conceitualmente:

ENTITY
ATTRIBUTE
VALUE
TRANSACTION

Algo como:

[1001 :conta/id "000123"]
[1001 :conta/titular "Arthur Dent"]
[1001 :conta/saldo 1000]

Então já aparece a primeira diferença fundamental:

Db2

“Tenho registros relacionais.”

Datomic

“Tenho fatos sobre entidades ao longo do tempo.”

House olha para o quadro.

— Não são duas implementações do mesmo modelo.

— Então são doenças diferentes?

— Não. São anatomias diferentes.


2. O grande choque: UPDATE

Aqui começa a parte que faz o COBOLzeiro apertar a caneca.

Em Db2:

UPDATE CONTA
   SET SALDO = 800
 WHERE ID = '000123';

Estado anterior:

SALDO = 1000

Estado atual:

SALDO = 800

Claro: Db2 possui transaction log, temporal tables, auditing, CDC e recursos para reconstruir histórico.

Mas o modelo lógico mais comum continua sendo:

ANTES
  ↓
UPDATE
  ↓
DEPOIS

Datomic trata a evolução do dado de forma diferente.

O histórico faz parte do modelo.

Conceitualmente:

T1
conta/saldo = 1000

T2
retract saldo 1000
assert saldo 800

Você não simplesmente “apagou” a existência anterior.

Você criou uma nova realidade temporal.

House aponta:

— Um sofre amnésia por padrão lógico.

Wilson responde:

— Db2 não perde o passado, House.

— Eu disse lógico, não físico. Preste atenção.

Essa distinção é importante.


3. Db2 tem logs. Datomic tem memória histórica como filosofia

Db2 registra transações para recovery.

Isso é central.

BEGIN
  UPDATE
  UPDATE
COMMIT

Db2 precisa saber como:

ROLLBACK
REDO
UNDO
RECOVER

O log é infraestrutura de sobrevivência.

Datomic trata a história como parte natural do database value.

Você pode consultar algo como:

as-of
since
history

Ou seja:

QUAL ERA O BANCO
EM T1?

não é uma pergunta excepcional.

É parte natural da arquitetura.

Aqui está uma diferença conceitual enorme.

Db2:

histórico pode ser construído, configurado, auditado e recuperado.

Datomic:

histórico está no DNA.

Nenhum dos dois é “mais sério” automaticamente.

Mas o segundo torna alguns problemas temporais muito mais naturais.


4. Diagnóstico diferencial: SQL versus Datalog

Db2 fala SQL.

E SQL é provavelmente uma das linguagens técnicas mais difundidas da história.

SELECT C.NOME,
       SUM(M.VALOR)
FROM CLIENTE C
JOIN MOVIMENTO M
  ON M.CLIENTE_ID = C.ID
WHERE C.STATUS = 'ATIVO'
GROUP BY C.NOME;

Milhões de pessoas entendem isso.

Datomic usa Datalog.

Exemplo conceitual:

[:find ?nome (sum ?valor)
 :where
 [?c :cliente/nome ?nome]
 [?c :cliente/status :ativo]
 [?m :movimento/cliente ?c]
 [?m :movimento/valor ?valor]]

O modelo é declarativo também.

Mas pensa mais em relações lógicas.

House olha.

— Isso é SQL depois de passar três semanas num retiro filosófico?

Cameron:

— É Datalog.

— Exatamente o que eu disse.

😂


5. Db2 tem tabelas. Datomic tem entidades e atributos

No mundo relacional:

CLIENTE
  |
  +-- ID
  +-- NOME
  +-- CPF
  +-- STATUS

No Datomic:

ENTITY 1001
  |
  +-- :cliente/id
  +-- :cliente/nome
  +-- :cliente/cpf
  +-- :cliente/status

Isso pode parecer semanticamente parecido.

Mas não é idêntico.

No Db2, schema é fortemente estruturado em tabelas.

No Datomic, atributos são entidades do próprio schema.

A flexibilidade muda.

E também muda a maneira de evoluir schema.

Em Datomic existe uma tendência forte a schema aditivo:

adiciona atributo
adiciona relação
preserva passado

No Db2 você pode fazer:

ALTER TABLE

com todos os cuidados que conhece.

O ponto é:

ambos possuem schema, mas a filosofia de evolução é diferente.


6. Índices: Db2 pergunta “qual index?”. Datomic responde “qual ordenação?”

No Db2:

TABLE
  |
  +-- INDEX A
  +-- INDEX B
  +-- INDEX C

Você escolhe índices conforme acesso.

O DBA pensa em:

CLUSTERING
CARDINALITY
SELECTIVITY
INDEX ONLY
MATCHING COLUMNS
ACCESS PATH

Datomic organiza datoms em índices como:

EAVT
AEVT
AVET
VAET

Onde:

E = Entity
A = Attribute
V = Value
T = Transaction

Para um COBOLzeiro com VSAM no DNA, isso é surpreendentemente compreensível.

Você pergunta:

— Como chego ao dado?

Resposta:

— Escolha a ordenação adequada.

Não é VSAM.

Mas seu cérebro reconhece o cheiro de índice.


7. Buffer pool versus cache: dois mundos, mesma física

Agora entramos numa comparação deliciosa.

No Db2, buffer pools são críticos.

DISK
  ↓
BUFFERPOOL
  ↓
SQL

Quanto mais páginas úteis permanecem em memória:

menos I/O
mais performance

Você pensa em:

GETPAGE
HIT RATIO
PAGESET
BUFFER POOL SIZE
PREFETCH

No Datomic:

STORAGE
  ↓
CACHE
  ↓
PEER / COMPUTE
  ↓
QUERY

A diferença é que segmentos imutáveis são particularmente amigáveis a cache.

Se um pedaço histórico não muda, ele não sofre o mesmo problema clássico de invalidação.

House:

— Então descobriram que dados que não mudam são fáceis de cachear?

Foreman:

— Simplificando, sim.

— Nobel amanhã.

😂

Mas tecnicamente é uma vantagem real.


8. Working set: aqui os dois se encontram

Essa é uma das partes mais importantes.

Imagine:

DATABASE = 20 TB
WORKING SET = 10 GB

e você possui cache/memória suficiente.

Pode funcionar muito bem.

Agora:

DATABASE = 2 TB
WORKING SET = 1,5 TB

e sua memória útil é 64 GB.

Problema.

Isso vale tanto para arquiteturas relacionais quanto para Datomic.

O tamanho total do banco não é a única pergunta.

A pergunta é:

quanto do dado útil precisa estar quente ao mesmo tempo?

O velho DBA e o engenheiro Clojure podem brigar sobre filosofia.

A física ignora os dois.


9. CPU: Db2 e Datomic gastam por razões diferentes

Db2 usa CPU em:

SQL execution
sort
join
predicate evaluation
index access
locking
logging
utilities
compression

Datomic usa CPU em:

queries
Datalog
transaction processing
indexing
caching
application-side computation
GC

E aqui aparece uma diferença importante:

Datomic vive no ecossistema JVM.

Então:

GARBAGE COLLECTION

entra no prontuário.

O COBOLzeiro:

— Finalmente achei o tumor.

House:

— Não. Só um sintoma.


10. Transações: ambos levam ACID a sério

Db2:

BEGIN
UPDATE
INSERT
COMMIT

ou:

ROLLBACK

Transação é parte central da arquitetura.

Datomic também oferece transações ACID.

Mas sua coordenação de escrita é arquiteturalmente distinta.

No Datomic Pro clássico:

WRITES
  ↓
TRANSACTOR
  ↓
STORAGE

Leituras podem ser distribuídas através de peers.

Isso cria um trade-off interessante:

READ SCALE
↑

muito bem horizontalizado.

Mas writes possuem uma coordenação ordenada.

O veterano imediatamente pergunta:

qual é o throughput máximo de escrita por database?

Essa é uma pergunta correta.


11. Db2 escala diferente

Db2 historicamente escala de várias maneiras.

No mainframe:

Db2
  |
DATA SHARING
  |
Parallel Sysplex

Você pode ter múltiplos members compartilhando dados com locking e buffer management distribuído.

Além disso:

partitioning
parallelism
zIIP
buffer pools
workload management

A filosofia é muito mais:

um sistema transacional extremamente poderoso e coordenado.

Datomic tende mais a:

muitos databases/domínios, reads distribuídos, facts imutáveis e sharding arquitetural.

Nenhuma solução é “mais moderna” por definição.

São estratégias diferentes.


12. Escala: uma base monstruosa ou vários domínios?

No mundo tradicional, é natural encontrar:

PRODUCTION DB2
████████████████████████████████
muitos sistemas
muitas tabelas
muitos anos
████████████████████████████████

Datomic, especialmente em arquiteturas de microservices, incentiva uma decomposição maior:

SERVICE A → DATABASE A
SERVICE B → DATABASE B
SERVICE C → DATABASE C
SERVICE D → DATABASE D

Isso ajuda a explicar números como dezenas de milhares de databases em uma empresa como Nubank.

Mas traz outra complexidade:

distributed consistency
cross-service workflows
events
reconciliation
ownership
observability

House escreve no quadro:

MONOLITO:
complexidade interna

MICROSERVIÇOS:
complexidade distribuída

— Escolha onde quer sofrer.


13. Recovery: aqui o velho médico fica sério

Db2 possui uma história monumental de recuperação.

Você tem:

logs
image copies
RECOVER
REORG
RUNSTATS
utilities
PIT recovery
system-level backup
data sharing recovery

Décadas de prática.

Datomic também possui mecanismos de durabilidade, HA, backups e reconstrução, mas o ecossistema operacional é diferente e muito menor.

Se você perguntar:

“Quem conhece todos os detalhes de recuperação do Db2 em produção?”

há um mercado gigantesco de experiência.

Para Datomic:

o universo é muito menor.

Isso é risco.

Não necessariamente falha da tecnologia.

Mas risco de skills e tooling.


14. Operação: o que acontece às 03:17?

Essa talvez seja a diferença mais subestimada.

Db2 tem:

DBA
sysprog
vendor support
utilities
APARs
PTFs
Redbooks
manuals
decades of incidents

Datomic tem:

smaller community
Clojure expertise
specialized knowledge
fewer battle-tested operators

Hoje possui produção gigantesca em Nubank.

Mas não possui a mesma ubiquidade operacional.

House:

— O remédio novo pode ser excelente.

Wilson:

— Mas?

— Se ninguém no hospital sabe dosar, administrar ou tratar efeitos colaterais, isso também entra no diagnóstico.

Exatamente.


15. Skill gap versus obscuridade

Db2:

difícil achar bons especialistas?
sim

mas existem muitos.

Datomic:

especialistas?
existem

mercado?
pequeno

Agora coloque Clojure junto.

Seu pool de recrutamento diminui ainda mais.

Isso pode ser aceitável para uma empresa que constrói cultura própria, treina pessoas e domina a stack.

Pode ser um desastre para uma empresa que terceiriza tudo e troca consultoria a cada dois anos.

Essa é uma consideração organizacional, não apenas técnica.


16. Vendor lock-in: os dois têm, mas de formas diferentes

Db2:

IBM ecosystem
z/OS integration
utilities
features
licensing
skills

Se você explora profundamente recursos específicos, migrar pode ser caro.

Datomic:

Datomic model
Datalog
Clojure ecosystem
API model
temporal semantics

Também cria dependência.

A diferença é que no caso Datomic o ecossistema é menor.

Mas há uma peculiaridade histórica:

Nubank acabou adquirindo Cognitect.

Então:

usuário
  ↓
produto
  ↓
fabricante

vira

usuário + mantenedor

Isso reduz um risco para Nubank.

Não necessariamente para todos.


17. Histórico e auditoria: Datomic brilha

Se seu domínio vive perguntando:

qual era o estado?
quando mudou?
quem introduziu?
qual sequência produziu isso?

Datomic possui uma elegância impressionante.

Isso pode ser ouro em:

fraude
compliance
investigação
reprodução de estado
auditoria
reprocessamento

Db2 faz isso muito bem com ferramentas e recursos adequados.

Mas frequentemente você precisa arquitetar mais explicitamente:

temporal tables
audit columns
CDC
history tables
logs
triggers

Datomic coloca o tempo no centro.

Essa é provavelmente uma das maiores razões para escolhê-lo.


18. Mas histórico custa storage

Datomic preserva fatos.

Além disso, datoms aparecem em múltiplas ordenações de índice.

Então:

mais história
+
mais índices
=
mais storage

Pode haver compressão e atributos noHistory, mas a filosofia continua.

Db2 pode ser mais econômico se o requisito for apenas estado atual e histórico limitado.

Então:

Datomic

“O passado é precioso.”

Db2

“Diga quanto passado você quer e eu configuro.”

House:

— Um é historiador.

— E o outro?

— Contador.


19. Throughput de escrita: aqui Datomic exige respeito

Se seu sistema é:

READS >>> WRITES

Datomic pode se encaixar muito bem.

Se seu problema é:

WRITE FIREHOSE

você precisa medir cuidadosamente.

Porque a serialização transacional por database e background indexing criam limites naturais.

Se a taxa de entrada ultrapassa a capacidade de indexação:

MEMORY INDEX cresce
   ↓
back pressure
   ↓
write throughput reduz

Db2 também possui limites, obviamente.

Locks.

Log throughput.

I/O.

Latches.

Buffer contention.

Mas sua arquitetura e histórico de workloads OLTP de escrita extrema são muito conhecidos.

Para uma central bancária gigantesca, isso pesa.


20. Query analítica: nenhum dos dois substitui tudo

Datomic não deveria virar:

data lake
warehouse
log bucket
BI universal

Da mesma forma, Db2 OLTP não deveria necessariamente ser martelado com qualquer analytics gigantesco sem arquitetura adequada.

No mundo moderno:

SYSTEM OF RECORD
   ↓
CDC/EVENTS
   ↓
ANALYTICS PLATFORM

é frequentemente melhor.

House:

— Então não coloque tudo no mesmo banco?

— Exato.

— Finalmente uma ideia saudável.


21. Mainframe versus cloud: não confunda database com plataforma

Db2 pode existir em várias plataformas, mas para nosso universo Bellacosa, pense em Db2 for z/OS.

Aí você ganha:

IBM Z
z/OS
WLM
Sysplex
RACF
zIIP
SMF
RMF
CICS
IMS
MQ

O database vive dentro de uma infraestrutura extremamente integrada.

Datomic normalmente vive numa arquitetura distribuída/cloud-native:

AWS
compute
storage
DynamoDB/S3 em Datomic Cloud
Clojure
services
Kafka
Kubernetes

Então parte da comparação não é:

Datomic vs Db2

É:

ARQUITETURA DISTRIBUÍDA
vs
PLATAFORMA INTEGRADA

Isso muda custo, skills, observabilidade, DR e operação.


22. Segurança: Db2 herda um castelo

Db2 for z/OS vive num ambiente com:

RACF
SAF
audit
SMF
encryption
TLS
dataset protection
roles
privileges

É um ecossistema de segurança brutalmente maduro.

Datomic depende de sua arquitetura e da cloud:

IAM
network policies
KMS
secrets
AWS controls
application authorization

Ambos podem ser seguros.

Mas segurança no mainframe tende a ser altamente centralizada e conhecida.

No cloud-native, a superfície é mais distribuída.

Mais flexível.

E também mais fácil de configurar errado.


23. Observabilidade: SMF versus mundo distribuído

Db2:

SMF
RMF
IFCID
statistics
accounting traces
performance monitors

Você consegue investigar profundamente.

Datomic + microservices:

metrics
logs
traces
OpenTelemetry
application telemetry
AWS metrics
JVM metrics
GC metrics

O problema moderno é que uma transação pode atravessar dez serviços.

Então observability distribuída vira essencial.

O velho DBA olha para isso e diz:

— Vocês desmontaram o sistema e agora precisam descobrir onde cada pedaço está.

😂

É maldade.

Mas contém um pouco de verdade.


24. Latência: proximidade importa

Db2 for z/OS próximo de CICS:

CICS
 ↓
COBOL
 ↓
Db2

latência muito baixa e altamente previsível dentro da plataforma.

Datomic pode ganhar em leituras locais através de caches/peers.

Mas numa arquitetura cloud existem mais possibilidades de:

network hop
service hop
timeout
retry

Em compensação, você pode escalar serviços independentemente.

Trade-off.

Sempre trade-off.


25. Consistência distribuída: Datomic simplifica algumas coisas e complica outras

Dentro de um database Datomic, consistência é forte e transações são ordenadas.

Mas se você possui:

DB A
DB B
DB C

e um workflow precisa alterar todos:

agora você tem uma questão distribuída.

Pode usar:

events
sagas
reconciliation
idempotency

O velho mainframe pensa:

“Então vocês tiraram a complexidade do banco e colocaram na aplicação?”

Às vezes, sim.

Não por incompetência.

Por escolha arquitetural.


26. Db2 também não é mágico

Agora vamos bater no outro paciente.

Db2 pode virar:

monstro

com:

milhares de tabelas
milhares de índices
stored procedures
triggers
views
packages
utilities
bindings
access paths
partitions

E se ninguém cuida:

RUNSTATS velho
REBIND errado
buffer mal dimensionado
index demais
SQL ruim
locking
tablespace gigante

a criatura degrada.

House:

— Tecnologia madura não cura arquitetura ruim.

Exatamente.


27. Por que eu escolheria Db2?

Se eu tivesse:

core financeiro crítico
alto volume OLTP
equipe mainframe madura
CICS
COBOL
IMS/MQ
necessidade de SQL
forte integração z/OS
ferramentas robustas
auditoria consolidada

Db2 seria uma escolha extremamente natural.

Principalmente quando:

risk tolerance = LOW

e:

operational predictability = VERY HIGH

Você compra não apenas database.

Compra décadas de ecossistema.


28. Por que eu escolheria Datomic?

Se eu tivesse:

greenfield
Clojure
domínio temporal forte
histórico essencial
muitos reads
arquitetura distribuída
microservices
preciso reconstruir estados

Datomic poderia ser extremamente atraente.

Especialmente se minha organização estivesse disposta a dominar:

Clojure
Datalog
capacity model
sharding
observability
cloud operations

Ele pode reduzir complexidade em problemas históricos/temporais que seriam mais trabalhosos em bancos tradicionais.


29. O maior erro: escolher Datomic porque Nubank usa

House escreve:

NUBANK USES IT
≠
YOU SHOULD USE IT

Isso vale para qualquer tecnologia.

Netflix usa algo?

Legal.

Google usa algo?

Interessante.

Banco X usa algo?

Ótimo.

Pergunta:

seu problema é igual?

Provavelmente não.

Arquitetura de referência não é receita de bolo.


30. O segundo maior erro: escolher Db2 só porque “sempre usamos”

Agora House vira para o outro lado.

WE ALWAYS USED DB2
≠
DB2 IS BEST HERE

Se o sistema é novo, isolado, temporal, distribuído e possui requisitos diferentes, talvez Db2 seja exagero ou inadequado economicamente.

Legado pode ser estabilidade.

Mas também pode virar automatismo.

O bom arquiteto pergunta:

por que estamos escolhendo isso?

Não:

“qual tecnologia eu já conheço?”


31. Comparativo direto

TemaDb2Datomic
ModeloRelacionalFatos imutáveis
QuerySQLDatalog
AtualizaçãoUPDATEassert/retract
HistóricoRecursos específicos/logs/temporalNativo ao modelo
TransaçõesACIDACID
EscritasOLTP altamente maduroSerializadas por database
LeiturasMuito escalável, inclusive Data SharingPeers/compute horizontais
CacheBuffer poolsSegments/caches imutáveis
ÍndicesDefinidos pelo schema/workloadEAVT/AEVT/AVET/VAET
EcossistemaGigantescoPequeno
SkillsAmplamente disponíveisNicho
ToolingExtremamente maduroEspecializado
HA/DRDécadas de soluçõesDisponível, arquitetura diferente
Cloud fithíbrido/múltiplas opçõesforte
Mainframe fitnativo em z/OSnão
Temporalidadepoderosa, mas configuradacentral
Vendor riskIBMecossistema Datomic/Nubank
Greenfielddependeforte candidato
Core bancário legadoexcelente fitmigração não trivial

32. Easter egg: House faz o teste do saldo

House escreve:

SALDO INICIAL = 1000

Depois:

COMPRA = 200

Pergunta:

— Db2?

UPDATE CONTA
SET SALDO = 800;

— Datomic?

assert novo saldo 800
retract saldo 1000

House:

— Qual está certo?

Foreman:

— Ambos.

— Finalmente.

Depois:

— Qual consegue dizer que o saldo foi 1000 antes?

Cameron:

— Ambos podem, se o Db2 estiver adequadamente configurado.

House sorri.

— Agora você está aprendendo.


33. O verdadeiro teste não é performance

É falha.

Pergunte:

O que acontece se:
  • storage ficar lento?

  • rede quebrar?

  • processo morrer?

  • região cloud falhar?

  • transaction log encher?

  • buffer pool degringolar?

  • indexing atrasar?

  • GC congelar?

  • deploy inserir bug?

  • schema mudar errado?

  • restore falhar?

  • DR não estiver testado?

Tecnologia não se prova em benchmark.

Prova-se:

quando o mundo fica feio.


34. O diagnóstico final de House

House olha para o quadro.

De um lado:

Db2

Do outro:

Datomic

Ele apaga a palavra:

VERSUS

e escreve:

FOR WHAT?

Porque esse é o diagnóstico.

Db2 não é “velho demais”.

Datomic não é “novo demais”.

Db2 traz:

maturidade
ecossistema
ferramentas
performance OLTP
integração z/OS
skills
previsibilidade

Datomic traz:

imutabilidade
tempo
fatos
histórico
read scaling
arquitetura funcional
modelagem diferente

São propostas distintas.


☕ Epílogo — O paciente sobrevive

São 03h42.

Produção liga.

Foreman atende.

— Temos problema.

House:

— Db2?

— Não.

— Datomic?

— Também não.

— Então?

— A aplicação cobrou o cliente duas vezes.

House olha para o time.

— Infrastructure?

— Tudo verde.

— Database?

— Consistente.

— Logs?

— Perfeitos.

— Então quem errou?

Silêncio.

House aponta para o quadro:

APPLICATION LOGIC

— Everybody lies.

Incluindo código.

O COBOLzeiro no canto toma café.

Porque essa é a verdade que atravessa VSAM, IMS, Adabas, Db2, Datomic, Oracle, PostgreSQL e qualquer banco que ainda inventaremos:

um database pode armazenar perfeitamente a coisa errada.

No final, a pergunta nunca foi:

“Qual database é melhor?”

É:

“Qual arquitetura torna mais difícil errar, mais fácil detectar quando erramos e mais seguro recuperar quando inevitavelmente errarmos?”

Para um core bancário tradicional fortemente integrado ao IBM Z, com décadas de lógica COBOL/CICS e requisitos de altíssimo throughput transacional, Db2 continua sendo uma escolha absurdamente forte.

Para um sistema greenfield, distribuído, fortemente temporal, Clojure-native, com histórico e reconstrução de estado no centro do problema, Datomic pode oferecer uma elegância que o modelo relacional não entrega da mesma maneira sem bastante engenharia adicional.

Mas se alguém entrar na reunião dizendo:

“Vamos usar Datomic porque Nubank usa.”

House deveria expulsá-lo.

E se outro disser:

“Vamos usar Db2 porque sempre usamos.”

House também.

Depois perguntaria:

QUAL É O PROBLEMA?

Só então escolheria o tratamento.

Porque banco de dados, assim como medicina, não é sobre preferência pessoal.

É sobre diagnóstico correto, efeitos colaterais conhecidos e o paciente continuar vivo depois do deploy.

☕ Fim do café.

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.

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...