Fórum Travamento pessimista #182812
18/09/2003
0
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
Nelson Lima
_nekinho_
Curtir tópico
+ 0
Responder
Posts
18/09/2003
Fava
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´ ?
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´ ?
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)