Clipper On Line • Ver Tópico - Problema grave com Transação do LetoDb

Problema grave com Transação do LetoDb

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Problema grave com Transação do LetoDb

Mensagempor Cavalo Marinho » 13 Jun 2015 08:34

Pessoal veja se alguém já passou por isso e teve solução
Tenho no sistema uma rotina de atualização de valores em uma tabela, ou seja vou para o inicio do arquivo percorro todos os registros atualizando diversos valores, exemplo:
go top
while !eof()
replace campoa, campob, campoc etc
skip
enddo
Claro que tem bloqueio de de arquivo antes, em DBF/CDX ou LETODB sem controle de transação funciona bem, acontece que resolvi aproveitar as características do leto de transação, então incluir na rotina leto_beginTransaction(), ficando mais ou menos assim

go top
Flock()
begin sequence
Leto_BeginTransaction()
while !eof()
faz os replaces dos campos
skip 1
enddo
recovery using oErrr
mensagem de erro
leto_rollback()
end sequence
leto_CommitTransaction()
DbUnlockAll()

Claro que tem o controle de erro com errorblock, aí só foi o esqueleto da rotina, como expliquei acima sem o controle funciona perfeitamente, quando coloco o controle, pois quero que o sistema ou atualize tudo ou não atualize nada ele inicia normal mas ao tempo que vai atualizando os registro vai se tornando cada vez mais lento até não conseguir completar a operação, a tabela tem cerca de 50.000 registros, em DBF/CDX cerca de 8 minutos, com LetoDb sem transação, 15 minutos, e com controle de transação não conseguir avaliar pois já tinha se passado mais de 3 horas e ficava em torno de 60%.
Peço uma luz aos mestres para encontrar uma solução, se existir ou pode ser um bug do letoDb?
Avatar de usuário

Cavalo Marinho
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 155
Data de registro: 01 Ago 2009 10:01
Cidade/Estado: Aracaju/Se
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Problema grave com Transação do LetoDb

Mensagempor Mario Mesquita » 14 Jun 2015 09:27

Bom dia.

Amigo, não seria o caso de colocar o seu código real para ser avaliado? Às vezes, um detalhe pode ser a causa do problema e com algumas linhas de exemplo talvez não seja possível dar uma opinião.

Estou acompanhando os posts sobre o LetoDb, pois estou interessado em trabalhar com ele e preciso saber se posso usa-lo sem sustos.

Abraço,
Mario.
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes

Problema grave com Transação do LetoDb

Mensagempor janio » 14 Jun 2015 11:30

Tive problemas com transações no Leto!

Desisti! Continuo usando mas sem transacoes

viewtopic.php?f=42&t=15125
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

Problema grave com Transação do LetoDb

Mensagempor Itamar M. Lins Jr. » 14 Jun 2015 15:42

Mas essa lógica ai está muito aquém do normal...
Rollback no DBF inteiro ?
Eu vejo que o pessoal usar a cada registro e libera.


do while ..

flock..
begin
replace
if erro... no replace
   rollback...
   mensagem ("Falha tal!!!...
   exit
endif
commit..

skip
EndDo



Sinceramente não vejo necessidade nenhuma do "transaction" nesse cenário (Do while)
Vejo isso mais em rotinas isoladas que a ultima coisa deve está 100% de acordo com a primeira.

Tipo só salvar a NFe se todos os itens do pedido estiverem OK

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Problema grave com Transação do LetoDb

Mensagempor Cavalo Marinho » 15 Jun 2015 07:47

Ok, obrigado a todos por responderem
Itamar o usual é deste jeito, e eu uso assim, por exemplo na rotina de fechamento da venda, faço as persistências dos registros necessários e commito a transação ou faço um rollbak se houver algum erro, acontece que o meu calcanhar de Aquilis é esta atualização de tabela, e veja porque não faço transação registro a registro, suponha que na minha tabela de 50.000 registro eu atualize 20.000 e der algum problema, os outros 30.000 ficam sem atualização, é o que acontece (as vezes) com DBF/CDX, quando vi o letodb com o conceito de transação eu disse para mim mesmo "Heureca!" tenho a solução para meus problemas até então sonhada somente com um SGDB o que era impossível no velho clipper e no harbour com DBF/CDX. más para minha surpresa quando implementei o sistema passou a ficar muito lento e acontece uma especie de parada como explicado no post anterior.

Janio já tinha percebido este tipo de problema relatado no seu post de 2014, que voce não consegue encontrar um registro se ele ainda nao foi comitado, e olhe que eu estou usando a versão 2.14 bem mais recente do que seu post, acho que o Pavel não achou a solução.
Avatar de usuário

Cavalo Marinho
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 155
Data de registro: 01 Ago 2009 10:01
Cidade/Estado: Aracaju/Se
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Problema grave com Transação do LetoDb

Mensagempor janio » 15 Jun 2015 08:43

Ha situações que precisamos gravar informações no dbf inteiro. Nesse caso, rollbak em todo o arquivo eh necessário, caso ha algum erro.

Quem ja faz PAF-ECF sabe que no todo inicio do dia precisar gravar em um campo o SALDO EM ESTOQUE de cada produto.

Numa tabela com 30.000 produtos (meu caso), ou grava-se tudo, ou nada.

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

Problema grave com Transação do LetoDb

Mensagempor Itamar M. Lins Jr. » 15 Jun 2015 21:05

Não ficou claro p/ mim.
Eu não entendi. Posso fazer uma cópia do arquivo antes, e caso alguma falha, retornar, sem precisar de rollback.
Uso assim há muitos anos, nunca me deixou na mão, até rotinas de mudança de estruturas e tudo mais.... Faço uma copia e importo p/ o novo arquivo, caso aconteça alguma falha retorno, alias, eu só troco o nome do arquivo no final se tudo ocorrer sem problemas, e é uma questão de milésimos de segundos, renomear um arquivo.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Problema grave com Transação do LetoDb

Mensagempor Cavalo Marinho » 15 Jun 2015 21:56

É uma abordagem interessante esta, para alguns casos pode ser aplicado sim, neste meu caso acho que sem problema, já que travo o arquivo inteiro, mas ainda assim se um usuário quiser consultar não poderia. Veja o seguinte cenário, vários usuários já estão com os arquivos aberto em modo compartilhado, e um deles travando o arquivo pode fazer as atualização sem problema, pela sua abordagem se eu gero uma copia do arquivo, faço atualização na tabela original, gera um erro eu teria que fechar a original, excluir e renomear a copia para original, no caso teria que os usuários não estarem acessando este arquivo, más já que o letodb se propõe a ser um sgdb de dbfs deveria implementar a funcionalidade de atualização de uma tabela inteira sem lentidão ou travamentos pois pelo que conheço de sgdb todos fazem isso, sem contar os problemas que o Janio reportou que eu também já havia notado, contornei retirando a transação, fazendo do modo antigo. Acredito que no futuro o letodb faça isso como deve ser feito, claro que não podemos cobrar dele a eficiência de bancos famosos do mercado de sgdb, é esperar as correções.
Avatar de usuário

Cavalo Marinho
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 155
Data de registro: 01 Ago 2009 10:01
Cidade/Estado: Aracaju/Se
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Problema grave com Transação do LetoDb

Mensagempor Itamar M. Lins Jr. » 15 Jun 2015 22:05

Foi colocado lá, já li algumas criticas a respeito do LetoDb, por quem entende de fato.
Eu uso e pego alguns problemas com ele, memory leaks... e outros que o Pavel corrigiu, no mais é aguardar o que poderá ser feito p/ contornar esse problema.
Eu mandei um email, para ele, temos que aguardar a solução.
Uma outra coisa a ser feita e isolar o problema de lentidão com uso do TRANSACTION, talvez mostrando isso com um DBF exemplo igual ao que o Janio fez, porque ai não tem choro nem vela... Talvez alguma rotina do FOR NEXT, que mostre como vai ficando lento...

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Problema grave com Transação do LetoDb

Mensagempor Itamar M. Lins Jr. » 15 Jun 2015 22:20

No caso do Janio, eu prefiro fazer copia.
Não pode mexer no arquivo enquanto ele pega os saldos mesmo.
Alias é um arquivo, do PAF, então ninguém está usando, está puxando o saldo apenas. Se houver erro não precisa fazer nada, porque primeiro eu puxo p/ arquivo temporário, depois de tudo concluído eu renomeio A->B, é super rápido.

Saudações,
Itamar M. Lins J.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Problema grave com Transação do LetoDb

Mensagempor Cavalo Marinho » 16 Jun 2015 09:11

Ok. Itamar, mais uma vez obrigado por se preocupar.
Vou ver se tiro um tempo, não prometo para estes próximos dias, para fazer um exemplo bem mais enxuto e testar a atualização de uma tabela, aí posto aqui o arquivo DBF e a rotina de teste, assim fica mais fácil de identificar o problema.
Avatar de usuário

Cavalo Marinho
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 155
Data de registro: 01 Ago 2009 10:01
Cidade/Estado: Aracaju/Se
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Problema grave com Transação do LetoDb

Mensagempor Cavalo Marinho » 20 Jun 2015 10:51

Bom dia
Aqui estou eu de volta, fiz um pequeno programa para demonstrar a diferença de velocidade do DBF/CDX e LETODB em transação na atualização de uma tabela inteira, estou disponibilizando tanto o executável como os fontes (claro que é só um demo, mas representa exatamente o que utilizo), os srs podem notar que com dbf/cdx o contador é constante, quanto se utiliza o Leto começa bem veloz, mas ao processar alguns registros começa a queda de performance ficando lento quase parando, só tive paciência de esperar o processamento de cerca de 3500 registros de uma tabela de +600.000, com dbf/cdx levou apenas 12 minutos e 46 segundos em uma maquina com processadodr Intel Core2 2400Ghz sistemas operacional W7 32BITS.
TLENTO.rar
(6.53 MiB) Baixado 52 vezes
Avatar de usuário

Cavalo Marinho
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 155
Data de registro: 01 Ago 2009 10:01
Cidade/Estado: Aracaju/Se
Curtiu: 3 vezes
Mens.Curtidas: 3 vezes

Problema grave com Transação do LetoDb

Mensagempor Itamar M. Lins Jr. » 27 Jun 2015 22:48

Ola!
Dei uma simplificada no código e mandei para ele, vamos aguardar a resposta.

Function main
LOCAL aStru := {{"DATA","c",50,0}}

setmode(25,80)
cls
request DBFCDX,LETO
rddsetdefault("LETO")
dbsetdriver("LETO")
dbcreate("//localhost:2812/test.dbf",aStru,"LETO")
DbUseArea(.t.,"LETO",'//localhost:2812/test.dbf','pd',.F.,.F.)

@ 01,10 say "Append records: " + time()
For n := 1 to 8000
   pd->(DbAppend())
   @ 02,10 say "Add records: " + str(n)
NEXT
@ 03,10 say "Final Append records: " + time()
zap
@ 05,10 say "Append records: " + time()
leto_BeginTransaction()
For n := 1 to 8000
   pd->(DbAppend())
   @ 06,10 say "Add records: " + str(n)
NEXT
leto_CommitTransaction()
@ 07,10 say "Final Append records: " + time()

pd->(DbGoTop())

@ 09,10 say "Initial replace with transaction: " + time()
leto_BeginTransaction()
do while pd->(!eof())
   replace pd->DATA with "X"   
   pd->(DbSkip())
   @ 10,10 say "Replace process..." + str(recno())
enddo
leto_CommitTransaction()
@ 11,10 say "Final replace with transaction: " + time()

close all
return nil


Mandei duas! Uma com a transaction ligada no append(essa) e uma outra apenas com o replace... Tudo indica que tem um erro quando usamos transaction.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 15 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro