5. Gerenciamento de Transações
5.1. Modelo de transação
Uma transação é uma unidade de programa que acessa e possivelmente atualiza vários ítens de dados. Requeremos que uma transação não viole qualquer restrição de consistência do banco de dados. Isto é, se o banco era consistente quando uma transação iniciou, o banco precisa estar consistente quando a transação terminar sua execução com sucesso. Entretanto, durante a execução de uma transação, pode ser necessário temporariamente permitir a inconsistência. Esta inconsistência temporária, ainda que necessária, pode levar a dificuldades se ocorrer falhas.
Exemplo bancário
Considere algo como um sistema bancário simplificado de diversas contas e um conjunto de transações que acesse e atualize aquelas contas. Seja B uma transação que transfira R$50 da conta A para a conta B. Esta transação pode ser definida como:
T: read (A,a1) a1 = a1 - 50 write (A,a1) read (B,b1) b1 = b1 + 50 write (B, b1)
Caso ocorra uma falha durante a execução de T, o banco poderá entrar em um estado inconsistente.
5.2. Estados de uma transação
Uma transação precisa estar em um destes estados definidos abaixo.
Ativo à define o estado inicial de uma transação. Parcialmente executado à depois que a última instrução foi executada. Falho à depois da descoberta de que uma execução normal não pode mais prosseguir. Abortado à depois que a transação foi rolada para trás e o banco de dados foi restaurado ao seu estado anterior para o início da transação. Executado à depois de completada com sucesso.
Figura 5.1: Estados de uma transação.
Uma transação entra em um estado falho depois de determinado que a transação não mais prossiga com sua execução normal (por exemplo, devido a erros de hardware ou a erros lógicos). Tal transação precisa ser rolada para trás. Uma vez que isso é feito, a transação entra no estado abortado. Neste ponto, o sistema tem duas opções:
1. Reiniciar a transação. Isto ocorre apenas se a transação foi abortada como resultado de algum erro de hardware ou software que não foi criado através de uma lógica interna da transação. Uma transação reiniciada é considerada como sendo uma nova transação.
2. Matar a transação. Isto ocorre por algum erro lógico interno que pode ser corrigido apenas reescrevendo o programa aplicativo, ou devido a uma má entrada ou pelo fato de que um dado desejado não foi encontrado no banco de dados.
5.3. Definindo transações em SQL
Iniciando uma transação: Begin Work.
Finalizando uma transação: Commit Work.
Desfazendo uma transação: Rollback Work.
Embora o padrão seja descrito como mostra acima, a maioria dos SGBD’s define transações como mostra a seguir:
Iniciando uma transação: Begin Transaction.
Finalizando uma transação: Commit Transaction.
Desfazendo uma transação: Rollback Transaction. |