| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
joao_arthur Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006 Mensagens: 687 Localização: Fortaleza-CE
|
Enviada: Ter Out 27, 2009 10:46 am Assunto: lock conflict |
|
|
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 |
|
 |
afarias Aprendiz


Registrado: Domingo, 25 de Outubro de 2009 Mensagens: 197 Localização: Recife, PE
|
|
| Voltar ao Topo |
|
 |
joao_arthur Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006 Mensagens: 687 Localização: Fortaleza-CE
|
Enviada: Ter Out 27, 2009 11:57 am Assunto: |
|
|
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 |
|
 |
afarias Aprendiz


Registrado: Domingo, 25 de Outubro de 2009 Mensagens: 197 Localização: Recife, PE
|
Enviada: Ter Out 27, 2009 12:52 pm Assunto: |
|
|
|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 |
|
 |
joao_arthur Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006 Mensagens: 687 Localização: Fortaleza-CE
|
Enviada: Ter Out 27, 2009 10:08 pm Assunto: |
|
|
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 |
|
 |
afarias Aprendiz


Registrado: Domingo, 25 de Outubro de 2009 Mensagens: 197 Localização: Recife, PE
|
Enviada: Ter Out 27, 2009 10:25 pm Assunto: |
|
|
|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 |
|
 |
joao_arthur Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006 Mensagens: 687 Localização: Fortaleza-CE
|
Enviada: Ter Out 27, 2009 11:37 pm Assunto: |
|
|
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 |
|
 |
joao_arthur Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006 Mensagens: 687 Localização: Fortaleza-CE
|
Enviada: Ter Out 27, 2009 11:40 pm Assunto: |
|
|
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 |
|
 |
pestana Colaborador

Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qua Out 28, 2009 8:26 am Assunto: |
|
|
| 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 |
|
 |
pestana Colaborador

Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qua Out 28, 2009 8:34 am Assunto: |
|
|
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 |
|
 |
joao_arthur Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006 Mensagens: 687 Localização: Fortaleza-CE
|
Enviada: Qua Out 28, 2009 9:54 am Assunto: |
|
|
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 |
|
 |
pestana Colaborador

Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qua Out 28, 2009 10:38 am Assunto: |
|
|
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 |
|
 |
joao_arthur Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006 Mensagens: 687 Localização: Fortaleza-CE
|
Enviada: Qua Out 28, 2009 11:26 am Assunto: |
|
|
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 |
|
 |
pestana Colaborador

Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qua Out 28, 2009 1:34 pm Assunto: |
|
|
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 |
|
 |
joao_arthur Profissional


Registrado: Sexta-Feira, 10 de Novembro de 2006 Mensagens: 687 Localização: Fortaleza-CE
|
Enviada: Qua Out 28, 2009 10:24 pm Assunto: |
|
|
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 |
|
 |
|