Juliano Ignácio Segunda-feira, 12 de maio de 2003

Transações com o PostgreSQL - Parte I

Este será um artigo dividido em três partes. Trata-se de algo muito importante, um dos principais motivos pelo grande sucesso dos gerenciadores de banco de dados (SGBD/DBMS).

O gerenciamento das transações são feitos pelo PostgreSQL, no entanto, existem comandos, instruções e configurações que definem o seu comportamento. É exatamente isto que veremos neste conjunto de artigos.

PostgreSQL Banner

Você irá ver como o PostgreSQL permite juntar diversas alterações a serem efetuadas na base de dados como uma unidade única de trabalho, ou seja, quando você tem um conjunto de mudanças que devem ser todas executadas ou, se ocorrer algum problema, não será feito nada.


O QUE SÃO AS TRANSAÇÕES

Antes de mais nada precisamos saber como os dados são atualizados no PostgreSQL. Geralmente quando mostramos exemplos de alterações de dados em uma base, usamos uma única declaração para que esta alteração seja feita. Porém, no mundo real, encontramos diversas situações onde precisamos fazer diversas mudanças às quais seriam impossíveis de serem efetuadas em uma única declaração. Você ainda precisa que todas estas alterações obtenham sucesso, ou nenhuma delas deve ser efetuada, caso surja algum problema em qualquer ponto deste grupo de mudanças.

Um exemplo clássico é a transferência de dinheiro entre duas contas bancárias, podendo serem representadas até mesmo em tabelas distintas, e precisamos que uma conta seja debitada e a outra, creditada. Se debitarmos um valor de uma conta e ocorrer algum problema ao tentarmos creditar este valor, qualquer que seja o motivo, precisamos retornar o valor à primeira conta, ou sendo sendo mais coerente, este valor nunca chegou a ser debitado da primeira conta. Nenhum banco poderia manter-se no negócio caso eventualmente "perdesse" o dinheiro durante uma transação financeira entre duas contas (ou qualquer outra, logicamente).

Em bancos de dados relacionais baseados no ANSI SQL, como o PostgreSQL, isto é possível graças ao recurso de nome TRANSAÇÃO.

Uma transação é uma unidade lógica de trabalho que não deve ser subdividida.

Mas o que sabemos sobre unidade lógica de trabalho? Isto é simplesmente um conjunto de mudanças a serem efetuadas na base de dados onde todas devem ter sucesso, ou todas devem falhar. Exatamente como a transferência de dinheiro entre contas bancárias como mencionado acima. No PostgreSQL, estas mudanças são controladas por três instruções:

BEGIN WORK
declara o início de uma transação;

COMMIT WORK
indica que todos os elementos da transação foram executados com sucesso e podem agora serem persistidos e acessados por todas as demais transações concorrentes ou subsequentes;
ROLLBACK WORK
indica que a transação será abandonada e todas as mudanças feitas nos dados pelas instruções em SQL serão canceladas. O banco de dados se apresentará aos seus usuários como se nenhuma mudança tivesse ocorrido desde a instrução BEGIN WORK;

OBS: Tanto COMMIT WORK e ROLLBACK WORK podem omitir a palavra WORK, mas, em BEGIN WORK é obrigatório.

A padronização ANSI / ISO SQL não define a instrução BEGIN WORK, define que as transações iniciam-se automaticamente, mas esta é uma extensão muito comum presente - e requerida - em muitos bancos de dados relacionais.

Um segundo aspecto sobre as transações é que qualquer transação no banco de dados é isolada de outras transações que estão ocorrendo ao mesmo tempo. De uma forma ideal, cada transação se comportaria como se tivesse acesso exclusivo ao banco de dados. Infelizmente, como veremos nos próximos artigos, existem níveis de isolamento que, na prática, para atingir melhores performances algo será comprometido.

ACID : ÁCIDO, AGRE, AZEDO,... ?!!!

Não.. não tem nada haver com culinária...
ACID é um mneumônico (uma sigla) que descreve as propriedades que uma transação deve possuir.

Atomic
Atômica
Uma transação, mesmo sendo um conjunto de ações, deve ser executada como uma unidade única.Uma transação deve ser executada exatamente uma única vez, sem nenhuma dependência. Em nosso exemplo bancário, a movimentação financeira deve ser atômica. O débito em uma conta e o crédito em outra devem ambos acontecer como sendo uma única ação, mesmo se diversas instruções consecutivas em SQL fossem requeridas.
Consistent
Consistente
Ao término de uma transação, o sistema deve ser deixado em um estado consistente, respeitando as integridades de dados e relacional da base sendo manipulada. No exemplo da movimentação bancária, ao final da transação, ambas as contas devem ter sido atualizadas com os montantes corretos.
Isolated
Isolada
Isto significa que cada transação, não importando quantas transações estão sendo executadas neste momento no banco de dados, deve parecer ser independente de todas as outras transações. Imagine caixas eletrônicos separados, onde, diferentes pessoas querem executar a mesma operação bancária para a mesma conta. Transações processando duas ações concorrentes devem comportar-se como se cada uma delas estivessem operando com acesso exclusivo à base de dados. Na prática, nós sabemos que as coisas não são tão simples assim. Nós trataremos deste tópico nos próximos artigos.
Durable
Durável
Uma vez que a transação seja completada, ela deve permanecer completada. Uma vez que o dinheiro tenha sido transferido com sucesso entre as contas, ele deve permanecer transferido, mesmo que a máquina que está rodando o gerenciador de banco de dados pare por falta de energia elétrica. No PostgreSQL, assim como na maioria dos bancos de dados relacionais, isto é conseguido através de um arquivo que descreve as transações (transaction logfile). A maneira este arquivo funciona é bastante simples. Assim que uma transação é executada, as ações não são somente executadas na base de dados, mas também gravadas neste arquivo. Assim que a transação é completada, uma marca é gravada para dizer que a transação foi finalizada, e os dados gravados no arquivo logfile são forçados a permanecerem armazenados, então isto torna o banco de dados seguro mesmo que ele "caia". A durabilidade da transação acontece sem a intervenção do usuário, ou seja, é uma operação executada pelo próprio banco de dados.


OK? Até a próxima coluna com a segunda parte deste artigo.
Dúvidas, críticas e sugestões podem ser enviadas diretamente para meu e-mail, colocando no assunto (subject) "iMasters-PSQL".
Um abraço a todos.