O Processamento de Transações: BeginTrans, CommitTrans e RollBack.

Uma transação pode ser definida como uma série de alterações realizadas nos dados de uma aplicação. Assim o início de uma sessão começa uma transação e o encerramento da sessão (fechamento do programa) termina a transação.

O ínicio de uma nova transação é marcada pela diretiva BeginTrans , o encerramento pela diretiva CommitTrans e o Cancelamento da transação pela diretiva RollBack.

O processamento da transação é realizado pelo objeto Workspace definido em uma sessão.Então temos:

- BeginTrans - Inicia uma nova Transação
- CommitTrans - Encerra a transação atual e salva as alterações realizadas durante o processamento.
- RollBack - Encerra a transação atual e restaura os dados a sua posição quando do inicio da transação.

O processamento de transações permite a você proteger a integridade dos dados garantindo que múltiplas alterações em uma ou mais tabelas de dados ocorram de forma integrada , permitindo que todas as alterações sejam realizadas ou caso contrário nenhuma alteração ocorra.

Por exemplo : a transferência de valores de uma conta corrente para a conta de poupança de uma pessoa precisa ser realizada como uma transação , vejamos os passos envolvidos:

1. Você deve subtrair valores da conta corrente
2. E deve somar os valores subtraídos da conta corrente à conta de poupança
3. Se alguma das alterações falhar você terá problemas , para evitar isto usaremos o processamento de transações.

- A escrita do banco de dados que precisa ocorrer como uma unidade deve ser colocada entre os métodos BeginTrans e CommitTrans
- O método RollBack irá cancelar as modificações feitas desde que BeginTrans foi ativado.

'Vejamos o exemplo de débito de um valor da Conta Corrente e Crédito na Conta de Poupança dim db as database dim conta as recordset dim poupanca as recordset set db=OpenDatabase( app.path & "\banco.mdb") set conta=db.OpenRecordset("tblconta", DbopenTable) set poupanca=db.OpenRecordset("tblpoupanca", dbOpenTable) 'inicia a transação tratando todas as alterações subsequentes como uma unidade DBEngine.Workspaces(0).BeginTrans conta.edit conta("saldo")=conta("saldo")-valor conta.update 'se a energia acabar neste ponto o valor não seria subtraido do saldo da conta corrente poupanca.addnew poupanca("saldo")=poupanca("saldo")+valor poupanca.update 'neste ponto iremos permitir ao usuário salvar as alterações ou abortá-las If MsgBox("Confirma a operação : Debito em Conta Corrente e Crédito em Poupança ? ", vbYesNo) = vbYes Then DBEngine.Workspaces(0).CommitTrans 'salva as alterações Else DBEngine,Workspaces(0).RollBack 'aborta as alterações End If

Podemos aninhar no máximo até cinco transações sendo que cada nível precisa ser encerrado antes que as transações de nível mais alto sejam executadas.

Quando usamos consultas ação há uma transação implícita sendo executada , de forma que se a consulta falhar as alterações não serão realizadas.

Quando múltiplas alterações precisam ser realizadas em uma ou mais tabelas, a utilização de transações aumenta a velocidade do processo, pois os dados serão armazenados em um cache de memória antes de serem escritos nos arquivos e assim o acesso a disco diminui. No momento que o cache encher um arquivo em disco de transferência termporário será usado e o desempenho cai.

Se você fechar o objeto Workspace sem salvar or encerrar as transações pendentes, as transações são automaticamente canceladas.(RollBack).

Se você usar o método CommitTrans ou o método RollBack sem iniciar uma transação com BeginTrans, o Jet retorna um erro.

Se você usar os métodos addNew, Edit ou Update dentro de um loop que editará mais que um registro , a versão 3.0 de Jet Engine, pode tratar o loop como uma transação implícita. Isto significa que as atualizações não serão necessariamentes efetuadas nos arquivos. Naturalmente isto afetará o tratamento de erros , o bloqueio de páginas e visibilidade das alterações para outros usuários. Para garantir que as alterações sejam imediatamente escritas nos arquivos encerre cada bloco Edit/Update dentro de uma transação explicita. Vejamos um exemplo abaixo:

While NOT RS.EOF WS.BeginTrans RS.Edit . . . 'código com as alterações RS.Update WS.CommitTrans RS.Movenext WEND

Quando você inicia uma transação, o Jet Engine grava esta operação em um arquivo no diretório definido pela variável TEMP de seu ambiente na estação. Se o arquivo de log da transação esgota o espaço disponível no diretório TEMP , o Jet dispara o erro 2004.

Dica: Para aumentar a performance de sua aplicação você pode encerrar as operações de acesso a disco dentro de blocos de transações. Desta forma você esta reduzindo o acesso a disco e trabalhando com o buffer de memória.

Até a próxima...