sábado, 1 de dezembro de 2012

Commitando... (Mais escovação de bit)



Há alguns anos tive uma reunião com um consultor da IBM chamado Antoine. O sujeito era belga, e seu português era tão perfeito quanto o meu inglês. Ou seja, passamos uma tarde praticamente nos comunicando por mímica e desenhos de flipchart.
De qualquer forma, o papo foi sobre o gerenciador de banco de dados DB2 e muito produtivo, até que Antoine fez uma pergunta que me desconcertou:
- Sua empresa tem uma rotina corporativa para controle de commit?
Não tínhamos, é claro, mas comecei a refletir sobre o assunto.
Na mesma linha do texto sobre bind, vou tratar aqui desse outro termo estranho, o commit, sobre o qual conversamos bastante nos cursos de Performance SQL que  ministramos na TI do Banco do Brasil.
Numa tradução livre, commit significa “confirmação”. No mundo DB2, trata-se exatamente disso. Ao executar uma instrução insert, delete ou update, o dado é fisicamente incluído, excluído ou alterado da tabela (podendo inclusive ser “enxergado” por outras instâncias). No entanto, somente após o commit a operação é efetivada. Inversamente, o rollback, desfaz o comando executado.
No ambiente mainframe, principalmente, o commit e o rollback são instruções “caras” em termos de processamento, porém são indispensáveis à estabilidade do ambiente produtivo e à integridade dos dados processados pelas transações. Um fim inesperado – também conhecido por abend – de uma rotina provoca a perda de todas as informações não commitadas.
Existem ainda situações complexas, em que há mais de um banco de dados envolvido. Um protocolo denominado two-phase-commit se encarrega de sincronizar a confirmação dos dados nos diferentes ambientes, evitando inconsistências na transação.
O commit é importante nas aplicações on-line, mas nas rotinas batch é ainda mais crítico. Mesmo programadores experientes costumam controlar o commit apenas implementando um contador e um loop a cada bloco de registros – mil ocorrências, por exemplo. Isso é insuficiente, e vamos explicar o porquê.
A questão é delicada porque, sob a ótica do desempenho, o commit deve ser realizado o mínimo possível. Inversamente, se considerarmos o aspecto da segurança, seria ideal commit a cada ciclo de processamento. Para atender a essas duas necessidades, portanto, conclui-se que sua periodicidade deve ser necessária e suficiente, ou seja, um uso parcimonioso do comando, de forma a haver um equilíbrio entre performance e segurança.
Aqui voltamos ao questionamento do Antoine. Ao commitar apenas pelo contador, não sabemos exatamente de quanto em quanto tempo o comando será executado. Mil registros podem ser processados em segundos ou horas.
É, pois, fundamental gerenciar a variável tempo. Como isso requer uma programação um pouco mais elaborada, um “serviço corporativo” traria uma série de benefícios à TI, encapsulando a “regras do negócio”, facilitando a codificação, evitando redundância de código, minimizando a incidência de erros e facilitando os testes.
A partir da sugestão do consultor da IBM, portanto, concebemos uma sub-rotina de commit. Essa importante ferramenta conferiu segurança e melhor desempenho aos programas batch de grandes sistemas corporativos.
Mais alguns lembretes:
  • O commit deve ser realizado sempre a partir do programa mais externalizado, preferencialmente aquele referenciado no JCL, nunca dentro de uma sub-rotina, pois esta não detém o controle do ciclo completo do processamento;
  • Se um componente Cobol batch não tem acesso ao DB2, porém realiza chamada(s) de sub-rotinas Cobol/SQL, sua compilação é como Cobol puro. No entanto, a procedure deve ser construída como se ele fosse um Cobol/SQL, ou seja, o JCL o chama via módulo específico do SGBD – no BB esse módulo é o IKJEFT01;
  • Mesmo com um controle rigoroso, um programa ainda pode ter problema de commit, quando uma instrução SQL for muito “pesada” e levar um tempo excessivo para ser executada. Nesses casos, pode ser necessário “quebrar” eventuais joins, subselects e outros comandos em instruções distintas, ou reavaliar como estão os índices das tabelas envolvidas;

  • Boas práticas orientam o uso do commit inclusive nos programas que realizam apenas consultas (instruções select). Isso libera recursos do SGBD, por exemplo, caso outra aplicação esteja esperando para executar um utilitário sobre o mesmo tablespace.

Bom, desculpem pelo texto excessivamente técnico, mas essa “escovação de bits” faz parte do dia-a-dia de quem trabalha com TI.