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


Uma transação pode ser definida como um conjunto de operações(alteração,inclusão,exclusão,atualização,etc.) realizadas nos dados de uma aplicação em um dado momento. Uma transação tem o seu início no início de uma sessão e o seu término no encerramento da sessão (fechamento do programa ou operaçã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:

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.
'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 temporá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 necessariamente 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...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti