ACID

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

ACID (acrônimo de Atomicidade, Consistência, Isolamento e Durabilidade - do inglês: Atomicity, Consistency, Isolation, Durability), é um conceito utilizado em ciência da computação para caracterizar uma transação em um Banco de Dados, entre outras coisas.

Atomicidade[editar | editar código-fonte]

Trata o trabalho como parte indivisível (atômico). A transação deve ter todas as suas operações executadas em caso de sucesso ou nenhum resultado de alguma operação refletido sobre a base de dados em caso de falha. Ou seja, após o término de uma transação (commit ou abort), a base de dados não deve refletir resultados parciais da transação.

Exemplos:

  • Ou todo o trabalho é feito, ou nada é feito.
  • Em uma transferência de valores entre contas bancárias, é necessário que, da conta origem seja retirado um valor X e na conta destino seja somado o mesmo valor X. As duas operações devem ser completadas sem que qualquer erro aconteça, caso contrário todas as alterações feitas nessa operação de transferência devem ser desfeitas;

Consistência[editar | editar código-fonte]

A execução de uma transição deve levar o banco de dados de um estado consistente a um outro estado consistente, ou seja, uma transação deve respeitar as regras de integridade dos dados (como unicidade de chaves, restrições de integridade lógica, etc...).

Por exemplo, considere um banco de dados que guarde informações de clientes e que use o CPF como chave primária. Então, qualquer inserção ou alteração no banco não pode duplicar um CPF (unicidade de chaves) ou colocar um valor de CPF inválido, como o valor 000.000.000-00 (restrição de integridade lógica).

Isolamento[editar | editar código-fonte]

Em sistemas multiusuários, várias transações podem estar acessando o mesmo registro (ou parte do registro) no banco de dados. Por exemplo, se um usuário tentasse alterar um registro e um outro estivesse tentando ler este mesmo registro.

O isolamento é um conjunto de técnicas que tentam evitar que transações paralelas interfiram umas nas outras, fazendo com que o resultado de várias transações em paralelo seja o mesmo o resultado destas mesmas transações sendo executadas sequencialmente (uma após a outra). Operações exteriores a uma dada transação jamais verão esta transação em estados intermediários.

Por exemplo, considere as duas seguintes transações efetuadas em um banco de dados com informações de funcionários de uma empresa:

T_1: Dar um bônus de 100 reais para o empregado portador do CPF 490.120.530-30, que tem um salário de 1000 reais.

T_2: Dar um bônus de 10% reais para o mesmo empregado (CPF 490.120.530-30, salário de 1000 reais).

Digamos que elas tenham a seguinte forma:

T_1:

  • seleciona funcionário que tenha CPF igual à 490.120.530-30;
  • altera o salário somando 100 reais;
  • faz o commit (confirma a gravação no banco de dados).

T_2:

  • seleciona funcionário que tenha CPF igual à 490.120.530-30;
  • altera o salário somando 10%;
  • faz o commit (confirma a gravação no banco de dados).

Se as duas transações forem executadas sequencialmente, os salário deste funcionário poderá ser:

T_1 e depois T_2: salário passa a ser 1100 reais e depois, somando 10% de 1100, passa a ser 1210 reais.

T_2 e depois T_1: salário passa a ser 1100 reais e depois, somando 100 reais, passa a ser 1200 reais.

Então, se executarmos estas duas transações em paralelo, o valor final do salário deste funcionário deve ser de 1200 ou de 1210 reais.

Se as duas transações não estiverem isoladas (uma puder ver os resultados parciais da outra), então, quando executadas em paralelo, pode ocorrer o seguinte:

  • T_1 seleciona o funcionário;
  • T_2 seleciona o mesmo funcionário;
  • T_1 altera o salário para 1100 reais;
  • T_2 altera também o salário para 1100 reais;
  • T_1 grava a mudança no banco de dados;
  • T_2 também grava a mudança no banco de dados.

Assim, no fim, o salário deste funcionário será igual à 1100 reais (valor gravado por T_2). Isto ocorreu neste exemplo porque deixamos as duas transições alterarem o mesmo campo (o salário) ao mesmo tempo. A propriedade de isolamento não permite que isto ocorra.

Algumas técnicas de isolamento conhecidas são os bloqueios bifásicos e ordenação de marcas de tempo.

Durabilidade[editar | editar código-fonte]

Os efeitos de uma transação em caso de sucesso (commit) devem persistir no banco de dados mesmo em presença de falhas. Garante que os dados estarão disponíveis em definitivo.

Referências