Selecao DevMedia QUERO SER PRIME

Fórum Problemas de DeadLocks com Ado SQL Server - Como resolver ? #330953

10/10/2006

0

Ola para todos.
Estou com um problema com relacao a transacoes no Delphi 6 + ADO

Estou utilizando o start da transacao a partir do AdoConnection, atraves do BeginTrans.

Meu problema esta com relacao as deadlocks, ou seja, inicializo uma transacao e as tabelas envolvidas
nele ficam com acesso exclusivo para quem iniciar primeiro. E, qdo outro usuario tentar atraves da rede
iniciar o mesmo processo (ex: cadastro de notas fiscais), o AdoConnection retorna Time Out e naum é
possivel trabalhar 2 ao mesmo tempo.

Deu uma lida sobre o isotationLevel mas naum consegui nenhum resultado. Talvez eu esteja usando o nivel
errado ou de uso errado.

Por favor, se alguem poder me auxiliar sobre esse problema, fico mto agradecido.

Desde ja, mto obrigado

Rafael


Iluvatar

Iluvatar

Responder

Posts

10/10/2006

Leorez

Tive este mesmo problema em um sistema de contabilidade, este tipo de bloqueio é padrão do SQL tem até como vc tratar isso mais passando alguns parametros no Select. Mais a melho forma é na hora de gravar vc abrir a transação e no final da instrução insert finalizar. Assim

try

if not conCtb.InTransaction then
conCtb.BeginTrans;


qryGrava.Close;
qryGrava.SQL.Text := ´ Insert into TABELA (Campo1, Campo2) values (valor1 ,valor2) ´;
qryGrava.ExecSQL;

conCtb.CommitTrans;

except
conCtb.RollbackTrans
end;


Responder

Gostei + 0

10/10/2006

Iluvatar

Tudo bem sobre os commits e rollbacks. Esse naum eh o problema.

o problema eh durante o tempo q a transacao esta aberta, independente da finalizacao.

someone ?


Responder

Gostei + 0

10/10/2006

Macario

Ola.


Que processos voce efetua entre o start e o commit/rollback?

Veja o tempo que a transacao fica aberta, o ideal e que fique o menor tempo possivel, assim minimizando a ocorrencia de DeadLocks.





:roll:


Responder

Gostei + 0

10/10/2006

Iluvatar

um exemplo de utilizacao eh na geracao de Notas Fiscais, onde sao efetuados selects, appends e edits.

a transacao eh iniciada qdo o usuario deseja lancar ou editar uma nota.

e qdo ocorre o begintrans, o deadlock acontece qdo alguem mais quer realizar uma outra NF.

alguma ideia ?


Responder

Gostei + 0

10/10/2006

Marcio.theis

Ao menos que coloque o TimeOut como 0(zero) removendo assim o TimeOut...


Responder

Gostei + 0

10/10/2006

Macario

um exemplo de utilizacao eh na geracao de Notas Fiscais, onde sao efetuados selects, appends e edits. a transacao eh iniciada qdo o usuario deseja lancar ou editar uma nota. e qdo ocorre o begintrans, o deadlock acontece qdo alguem mais quer realizar uma outra NF. alguma ideia ?


Ola.

Se voce inicia a transacao do momento da edicao da nota pelo usuario, ai e que se encontra o problema. Esta edicao pode demorar segundos, minutos ou horas. O ideal e que voce start a transacao no momento de efetivar a nota.

Acho que outros colegas tem a mesma opiniao


Responder

Gostei + 0

10/10/2006

Iluvatar

a questao eh q tenho a seguinte estrutura:

NF
NFItens
Detalhamentos
Duplicatas

sendo a ligacao correta para referencial de integridade.

ou seja, naum adianta eu incluir no NFItens caso a cabecalho naum esteja gravado.

a transacao me revolve as pendencias de naum necessitar no final, caso o usuario cancele ou ocorra alguma problema, de ficar lixo na base. E nao precisa ter q ficar monitorando para apagar dados cancelados. A transacao q estou usando, tem esse objetivo.

caso alguem possa dar uma luz ?
obrigado


Responder

Gostei + 0

10/10/2006

Macario

Ola.

Quais componentes de acesso voce utiliza ADO +???

Voce faz uso de ClientDataSet?


Responder

Gostei + 0

10/10/2006

Iluvatar

Eu utilizo somente o AdoConnection + AdoQuery

sem o clientDataSet.


Responder

Gostei + 0

10/10/2006

Iluvatar

bom, estou realizando testes ainda, porem, a utilizacao do comando ´WITH (NOLOCK)´ nas clausulas parecem ter resolvidos os problemas.

vou realizar mais testes e colocar nos clientes...se tudo funcionar, deixo registrado para as demais pessoas q tiverem esse problema.

obrigado a ajuda de todos


Responder

Gostei + 0

12/10/2006

Bon Jovi

vou realizar mais testes e colocar nos clientes...se tudo funcionar, deixo registrado para as demais pessoas q tiverem esse problema.
Resolve o lock perfeitamente, mas... atenção que WITH (NOLOCK) você estará fazendo leitura suja (lendo o que está dentro de uma transação não finalizada de outro usuário/sessão). Dependendo do tipo de aplicação isso é muito perigoso. Mas não há outra saída no 2000. Somente no SQL Server 2005, onde como na maioria dos SGDBs podemos ler o que está commitado sem bloqueio caso alguma transação esteja sendo executada.

E caso possa fazer leitura suja em toda a aplicação, execute SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. Assim não será preciso colocar NOLOCK em todas as tabelas e terá o mesmo efeito.

Só não aconselho essa prática!


Responder

Gostei + 0

12/10/2006

Bon Jovi

[quote:8524e03236=´Bon Jovi´]
vou realizar mais testes e colocar nos clientes...se tudo funcionar, deixo registrado para as demais pessoas q tiverem esse problema.
Resolve o lock perfeitamente, mas... atenção que WITH (NOLOCK) você estará fazendo leitura suja (lendo o que está dentro de uma transação não finalizada de outro usuário/sessão). Dependendo do tipo de aplicação isso é muito perigoso. Mas não há outra saída no 2000. Somente no SQL Server 2005, onde como na maioria dos SGDBs podemos ler o que está commitado sem bloqueio caso alguma transação esteja sendo executada.

E caso possa fazer leitura suja em toda a aplicação, execute SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. Assim não será preciso colocar NOLOCK em todas as tabelas e terá o mesmo efeito.

Só não aconselho essa prática![/quote:8524e03236]
Complementando:

A linha do SET TRANSACTION ... pode ser executada uma única vez no evento AfterConnection do Connection.

Leitura decente com SQL Server 2005:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar