Este artigo descreve os conceitos de transações em banco de dados utilizando o MySQL como referência.
Para que serve:
Serve como guia introdutório ao tema de transações em banco de dados a fim de apresentar uma visão inicial e prática sobre o tema.
Em que situação o tema é útil:
Transações são sempre úteis para o gerenciamento de bancos de dados e, principalmente, para manter a integridade e consistência de seus dados.
Resumo DevMan
Existem situações quando é vital a ordem em que as consultas são executadas, e que todos os comandos de query sejam consultados em grupo ou então que nenhum seja efetivado. Temos neste contexto a importância do conceito de transação. Neste contexto, este artigo descreve os conceitos de transações em banco de dados utilizando o MySQL como referência.
O que é uma transação?
Se você está se perguntando esta questão, provavelmente você está usando bancos de dados, onde normalmente não importa a ordem em que executamos transações, e se uma consulta falha, ela não tem impacto nas demais. Se estamos atualizando algum conjunto de conteúdo, normalmente não nos preocuparemos sobre quando a atualização é realizada, assim como o comando de leitura de dados que são executados. Similarmente, se uma atualização falha, as leituras podem ainda recuperar dados antigos nesse meio tempo.
No entanto, existem situações quando é vital a ordem em que as consultas são executadas, e que todos os comandos de query sejam consultados em grupo ou então que nenhum seja efetivado. O exemplo clássico para explicar o conceito de transações é descrito em um ambiente de um banco. Uma quantidade de dinheiro é transferida de uma conta de uma pessoa para a conta de outra pessoa, conforme o exemplo da Listagem 1 onde é descrita uma transferência de R$ 500,00 entre 2 contas.
Listagem 1. Exemplo de transação em um sistema bancário
UPDATE account1 SET balance=balance-500;
UPDATE account1 SET balance=balance+500;
Ambas as queries devem ser executadas ou então nenhuma delas. Não podemos ter o dinheiro sendo transferido da conta de uma pessoa, e então “desaparece” se por alguma razão a segunda query falha. Ambas as queries formam uma transação. Uma transação é simplesmente um número de queries individuais que são agrupadas e devem ser executadas juntas.
Uma pequena dose de ACID
Por um longo período, quando o MySQL não suportava transações, seus críticos concordavam que ele não estava de acordo com a regra ACID. O que eles queriam dizer é que o MySQL não estava de acordo com as quatro condições para as quais transações precisam estar aderentes para garantir a integridade dos dados. Essas quatro condições são:
• Atomicidade: Um átomo é dito como a menor particular possível, ou algo que não pode ser dividido. Atomicidade aplica este princípio para transações de banco de dados. As queries que compõem uma transação devem ser todas elas executadas ou nenhum delas deve ser executada (como o exemplo da Listagem 1).
• Consistência: Isso se refere às regras dos dados. Por exemplo, um corpo de artigo pode precisar de um cabeçalho de artigo associado a ele. Durante a transação (ou seja, dentro desta, durante a sua execução), esta regra pode ser quebrada, mas este estado não deve ser nunca visível de fora da transação.
• Isolamento: simples, os dados que estão sendo usados por uma transação não podem ser usados por qualquer outra transação até que a primeira transação seja completada. No exemplo da Listagem 2, temos inicialmente um saldo de conta com R$ 900,00. Existe um único depósito de R$ 100,00 e um saque de R$100,00, então o saldo da conta ao final deve permanecer o mesmo. No entanto, percebe-se que após sua execução o saldo fica em R$ 800,00, de forma que perdemos R$ 100,00. Essas 2 transações deveriam ter sido isoladas, e o resultado seria fornecido para a Conexão 2 apenas quando a transação da Conexão 1 fosse completada.
Listagem 2. Exemplo de isolamento em transação
Conexão 1: SELECT saldo FROM conta1;
Conexão 2: SELECT saldo FROM conta1;
Conexão 1: UPDATE conta1 SET saldo = 900+100;
Conexão 2: UPDATE conta1SET saldo = 900-100;
• Durabilidade: uma vez que uma transação for completada, seu efeito deve permanecer, e não ser reversível.
Transações em InnoDB
Transações são escritas entre declarações BEGINe COMMIT. Vamos criar uma tabela de exemplo do tipo InnoDB na Listagem 3 ...