Travamento pessimista

Delphi

18/09/2003

Alugem ae sabe como fazer um travamento pessimista usando Dbx com firebird? Tenho q fazer isso pq a edição dependo de um campo da tabela do mesmo registro. Se o campo tiver 0 ele pode ser editado mas se tiver 1 não pode! Deste já muito grato,

Nelson Lima


_nekinho_

_nekinho_

Curtidas 0

Respostas

Fava

Fava

18/09/2003

Como simular um travamento pessimista usando IBX ?
Certifique-se que a opção Autocommit esteja em OFF.

Cheque se a transação está InTransaction e se estiver de um commit (e se houver uma exceção, rollback).

Dentro de um loop faça o seguinte :

De um Start na transação.
Defina o comando SQL que vai travar o registro (por exemplo : update ATable set pkfield=pkfield where pkfield = :pkfield).
De um Prepare no comando de trava.
Passe o parâmetro necessário (no exemplo, pkfield)
Execute o comando de trava.
Se voce obter uma exceção de conflito de compartilhamento, de um rollback na transação e re-inicie o Loop, senão saia do loop.

Se a transação continua InTransaction então voce conseguiu travar o registro.


A partir daí, faça o seguinte :
Se necessário coloque o dataset em modo de edição.
Quando estiver pronto para atualizar os dados:
Se o comando de atualização (update) estiver preparado então desprepare-o (mude Prepared para false).
Prepare o update.
Atribua os valores aos parâmetros conforme necessário.
Execute o update.
De um Commit e em caso de exceção de um rollback. (Nesse estágio, se voce obteve uma exceção não foi devido à um conflito de compartilhamento mas sim devido à qualquer outro motivo).

Essa estratégia mantém o registro travado até que a transação seja finalizada.

Reconheça que, em um ambiente multiusuário com alto nível de concorrência, o método de travamento pessimista irá influir negativamente na performance. Se sua aplicação permite que um usuário vá almoçar deixando uma transação aberta eles com certeza irão querer a sua cabeça. Se eu tivesse a necessidade de usar travamento pessimista nesse tipo de ambiente então com certeza eu iria repensar no meu design.

Resposta enviada por Helen Borrie no forum de Interbase.

PS: Logo após a postagem dessa mensagem, Ann Harrison, a ´mãe´ do Interbase deu as seguintes opniões :

Seria melhor utilizar uma transação configurada como WAIT no Loop acima pois eliminaria muitas interações desnecessárias.

Ao invés de usar uma transação no-wait e desperdiçar o tempo do servidor, porque não postar uma mensagem periodica para o usuário dizendo que voce ´continua vivo´ ?


GOSTEI 0
POSTAR