ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

lock conflict
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
joao_arthur
Profissional
Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006
Mensagens: 687
Localização: Fortaleza-CE

MensagemEnviada: Ter Out 27, 2009 10:46 am    Assunto: lock conflict Responder com Citação

pessoal com esse problema quando um outro usuário tenta acessar o PDV

lock conflict on no wait transaction
deadlock
update conflicts with concurrent update
concurrent transaction number is 31344
_________________
João Arthur.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
afarias
Aprendiz
Aprendiz


Registrado: Domingo, 25 de Outubro de 2009
Mensagens: 197
Localização: Recife, PE

MensagemEnviada: Ter Out 27, 2009 11:00 am    Assunto: Responder com Citação

Basicamente um 'comando' está tentando atualizar um registro bloqueado por outro 'comando'.

É interessante saber QUAL o banco de dados e versão pois cada um implementa um sistema de 'concorrência' e/ou 'bloqueio' diferente.


T+
_________________
Acompanhe: SUPORTE, A SÉRIE:
http://andre.openintelligence.com.br/

Orkut: http://www.orkut.com.br/Main#Community?rl=cpn&cmm=96459906
Twitter: http://twitter.com/Andre_Suporte
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
joao_arthur
Profissional
Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006
Mensagens: 687
Localização: Fortaleza-CE

MensagemEnviada: Ter Out 27, 2009 11:57 am    Assunto: Responder com Citação

cara mais o q acontece é q o usuário nao ta fazendo nenhuma alteração esta somente com o PDV aberto e quando um segundo usuário tentar entrar no PDV ele da esse erro, eu to startando a transação no oncreate do formulario e como já tem uma trasação aberta com aquele usuário ai da esse erro, eu creio que seja isso, como posso resolver?
_________________
João Arthur.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
afarias
Aprendiz
Aprendiz


Registrado: Domingo, 25 de Outubro de 2009
Mensagens: 197
Localização: Recife, PE

MensagemEnviada: Ter Out 27, 2009 12:52 pm    Assunto: Responder com Citação

|cara mais o q acontece é q o usuário nao ta fazendo nenhuma alteração
|esta somente com o PDV aberto e quando um segundo usuário tentar entrar
|no PDV ele da esse erro, eu to startando a transação no oncreate do
|formulario e como já tem uma trasação aberta com aquele usuário ai da
|esse erro, eu creio que seja isso, como posso resolver?

1) NOVAMENTE, pergunto: QUAL O BANCO DE DADOS?

2) Iniciar uma transação sem fazer nada é errado. A melhor abordagem é iniciar transações apenas quando realmente for mandar um comando ao banco. E terminar (commit) a transação logo em seguida (após executar o(s) comando(s))

3) Dependendo do banco o problema pode estar relacionado aos parâmetros da transação q está usando. Então, quais parâmetros está usando para suas transações?


T+
_________________
Acompanhe: SUPORTE, A SÉRIE:
http://andre.openintelligence.com.br/

Orkut: http://www.orkut.com.br/Main#Community?rl=cpn&cmm=96459906
Twitter: http://twitter.com/Andre_Suporte
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
joao_arthur
Profissional
Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006
Mensagens: 687
Localização: Fortaleza-CE

MensagemEnviada: Ter Out 27, 2009 10:08 pm    Assunto: Responder com Citação

1 - Banco de Dados Firebird 2.1
2 - Transação
parametros:
-Read Committed
-rec_version
-nowait

cara uma pergunta eu posso deixar a transação fechada e só abrir quando for fazer alguma coisa no banco? até pra fazer somente consultas(selects)?
_________________
João Arthur.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
afarias
Aprendiz
Aprendiz


Registrado: Domingo, 25 de Outubro de 2009
Mensagens: 197
Localização: Recife, PE

MensagemEnviada: Ter Out 27, 2009 10:25 pm    Assunto: Responder com Citação

|cara uma pergunta eu posso deixar a transação fechada e só abrir quando
|for fazer alguma coisa no banco? até pra fazer somente consultas(selects)?

Deve! Esta é a melhor abordagem.

Especificamente o FB exige que vc use transações inclusive para SELECTS.

Os parâmetros de transação q está usando são OK!

Com os parâmetros q está usando, um SELECT *não* vai bloquear um registro, de forma que, seu programa deve estar executando algum UPDATE e não 'comitando'. É a única explicação para o "erro" (não é exatamente um erro, é apenas um aviso q o registro está bloqueado por outra transação q não foi concluída -- com commit ou rollback). Por isso, verifique!

E, tenha em mente que quanto menor o tempo de duração de uma transação melhor!

Tendo as transações sobre controle, é possível configurar a transação como WAIT (em lugar de NOWAIT) -- isso faria q ao encontrar um registro bloqueado, o FB aguarde em vez de retornar a exceção de 'lock conflict'. Entretanto esta opção deve ser usada com muito critério pois pode ser bem *perigosa*


T+
_________________
Acompanhe: SUPORTE, A SÉRIE:
http://andre.openintelligence.com.br/

Orkut: http://www.orkut.com.br/Main#Community?rl=cpn&cmm=96459906
Twitter: http://twitter.com/Andre_Suporte
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
joao_arthur
Profissional
Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006
Mensagens: 687
Localização: Fortaleza-CE

MensagemEnviada: Ter Out 27, 2009 11:37 pm    Assunto: Responder com Citação

cara é melhor eu usar CommitRetaining ou somente o Commit atualmente uso o CommitRetaining pois seu mudar pra commit as informações nao são gravadas no banco fisicamente a nao ser que eu feche o programa...agora usando o CommitRetaining ele grava legal...cara to perdido ta ossooo meu cliente ta bastante chateado porque nao pode usar dois usuários ao mesmo tempo o PDV...ufaaaa froid
_________________
João Arthur.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
joao_arthur
Profissional
Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006
Mensagens: 687
Localização: Fortaleza-CE

MensagemEnviada: Ter Out 27, 2009 11:40 pm    Assunto: Responder com Citação

cara vc pode me dar uns exemplos de como melhor tratar as transaçoes tipo em q momento ativo a transação em q momento desativo e tall...quando for dar um insert ou select..update e tal...eu uso os componetes da paleta interbase...IBDataSet, IBQuery, IBTable etcc..cara brigado pela ajudaa desde já agradeço.
_________________
João Arthur.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qua Out 28, 2009 8:26 am    Assunto: Responder com Citação

joao_arthur escreveu:
cara é melhor eu usar CommitRetaining ou somente o Commit atualmente uso o CommitRetaining pois seu mudar pra commit as informações nao são gravadas no banco fisicamente a nao ser que eu feche o programa...agora usando o CommitRetaining ele grava legal...cara to perdido ta ossooo meu cliente ta bastante chateado porque nao pode usar dois usuários ao mesmo tempo o PDV...ufaaaa froid


O Commit confirma a transação no banco (manipula os dados fisicamente no banco) e fecha.

O CommitRetaining faz a mesma coisa que o "Commit", mas não fecha a transação, ficando ativa por quanto tempo o usuário desejar, se o usuário fizer alguma operação no banco ou até mesmo uma consulta e ficar horas examinando esta consulta todos este tempo o transação esta aberto e transação aberta por muito tempo é sinonimo de prejuizo para o servidor (em questão de performance).

Citação:
pois seu mudar pra commit as informações nao são gravadas no banco fisicamente a nao ser que eu feche o programa


Eu não entendi o que você quiz dizer com isso, porque o commit serve justamente para isso gravar as informações fisicamente no banco.

De uma procurada aqui no fórum que tem vários tópicos falando sobre Transação!
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qua Out 28, 2009 8:34 am    Assunto: Responder com Citação

Eu tambem trabalho com os componentes IBX e alguns tempos atras eu utilizava o CommitRetaining, mas hoje eu mudei tudo agora eu somente utilizo transações curtas e sempre o Commit para manipular dados fisicamente no banco
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
joao_arthur
Profissional
Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006
Mensagens: 687
Localização: Fortaleza-CE

MensagemEnviada: Qua Out 28, 2009 9:54 am    Assunto: Responder com Citação

cara eu nao sei o q ta acontecendo quando uso o commit ele nao grava fisicamente mas quando uso commitretaining ele grava...é ossooo
_________________
João Arthur.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qua Out 28, 2009 10:38 am    Assunto: Responder com Citação

isso ocorre na mesma transação? porque não grava, você verificou no banco e os dados não constam atualizados?

Citação:
inicia a transação
...
confirma no banco (commit)


+/- isso:
Código:
try
   if not Transaction.InTransaction then
     Transaction.StartTransaction;
   ....
   Transaction.Commit;
except
   on E: Exception do
    begin
       if Transaction.InTransaction then
         Transaction.Rollback;
    end;
end;

_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
joao_arthur
Profissional
Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006
Mensagens: 687
Localização: Fortaleza-CE

MensagemEnviada: Qua Out 28, 2009 11:26 am    Assunto: Responder com Citação

cara me tira uma duvida quando eu to inserindo ou atualizando varias tabelas em um mesmo procedimento exemplo:

qryVenda

qryAtualizaEstoque

IBDSContasReceber

eu pertgunto pra cada ação dessa eu abro e fecho a transação? ou seja pra qryVenda eu abro quando terminar fecho? pra qryAtualizaEstoque eu abro denovo e fecho? pra IBDSContasReceber a mesma coisa? ou eu abro no começo e só fecho depois do IBDSContasReceber?
_________________
João Arthur.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qua Out 28, 2009 1:34 pm    Assunto: Responder com Citação

O certo é você abir um transação fazer tudo o que você quer, depois você fecha confirmando (commit) ou se houver erros cancela (rollback):

Entenda transação como pacotes, você quer gravar dados na tabelaX, mas tambem na tabelaY. O não pode acontecer é gravar dados na tabelaX e não gravar na tabelaY por causa de algum motivo erro.

Se você abrir 2 blocos de transação, como ficaria:

1º bloco
Código:
try
   if not Transaction.InTransaction then
     Transaction.StartTransaction;
   tabelaX.post;
   Transaction.Commit;
except
   on E: Exception do
    begin
       if Transaction.InTransaction then
         Transaction.Rollback;
    end;
end;


2º bloco
Código:
try
   if not Transaction.InTransaction then
     Transaction.StartTransaction;
   tabelaY.post;
   Transaction.Commit;
except
   on E: Exception do
    begin
       if Transaction.InTransaction then
         Transaction.Rollback;
    end;
end;


O que pode acontecer se houver um erro logo após a linha que possui este código tabelaY.post; a tabelaX gravou e confirmou os dados fisicamente no banco, mas a tabelaY não. Neste caso o ideal seria utilizar apenas um bloco de transação:

Código:
try
   if not Transaction.InTransaction then
     Transaction.StartTransaction;
   tabelaX.post;
   tabelaY.post;
   Transaction.Commit;
except
   on E: Exception do
    begin
       if Transaction.InTransaction then
         Transaction.Rollback;
    end;
end;


E se houver um erro será executado o rollback e não será gravado dados fisicamente no banco, caso contrário, transação envia o pacote ao banco para gravar fisicamente os dados da tabelaX e tabelaY.

entendeu agora? qualquer coisa posta novamente!



boa sorte!
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
joao_arthur
Profissional
Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006
Mensagens: 687
Localização: Fortaleza-CE

MensagemEnviada: Qua Out 28, 2009 10:24 pm    Assunto: Responder com Citação

cara nao to conseguindo controlar a transação fiz uns testes usando o sinática monitor e ele me mostra a transação o tempo toda ativa sendo q na aplicação eu fechei a transação pra ver o que acontecia mas ela consta ativo no sinátiva isso no PDV ja no retaguarda ta ok
_________________
João Arthur.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB