Ao desbloquear antes do COMMIT, você tornará disponível um registro que não foi atualizado pelas suas alterações. A partir daí, pense no que pode acontecer.janio escreveu:Causaria algum dano grave em um ambiente de rede DESBLOQUEAR o registro antes do DbCommit(), como faço no código abaixo?
É preciso dar um DBUNLOCK após um DBAPPEND() ??
Moderador: Moderadores
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Bem observado, essa é um erro que facilmente alguns podem passar por alto. Bem lembrado !. Aparentemente o ´codigo não tem erro mas a sequência deles pode causar falha de atualização no BDs.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Mas no exemplo que citei o DBUNLOCK() é indiferente, ou não!?Maligno escreveu:Ao desbloquear antes do COMMIT, você tornará disponível um registro que não foi atualizado pelas suas alterações. A partir daí, pense no que pode acontecer.
Vejamos:
Código: Selecionar todos
SELECT DESDO
DBSETORDER(1)
GOTO TOP
DBSEEK(vPEDIDO)
DO WHILE CODPED = vPEDIDO
TRAVA()
DBDELETE()
DBUNLOCK()
DBSKIP()
ENDDO
DBCOMMITALL()
Assim ele acabou DESBLOQUEANDO um registro ANTES do DBCOMMITALL().
Então o DBUNLOCK() depois do DBDELETE() (exemplo acima) é INDIFERENTE nesse caso.
Falei alguma besteira??
Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Por que ele está deletado. Mas veja: se você configurou para o sistema ignorar os registros deletados, após o SKIP você terá o ponteiro onde? Eu não tenho certeza de que ele estará apontando para o próximo registro vinculado ao pedido. Então, seria melhor você dar o SEEK dentro da malha. Se falhar, sai. Caso contrário, deleta.
Eu não faço assim. Meu método é diferente e não poderia fazer igual você. Eu limpo o registro inteiro pra só depois apagar. Mas meu esquema é automático. Eu tenho uma função que primeiro bloqueia todos os registros envolvidos e me devolve uma matriz com os números dos registros. Mando essa matriz pra outra função que faz o trabalho sujo. Ela limpa tudo, apaga e desbloqueia. Um por um. Mas só SE todos os registros foram bloqueados. Se falhar um que seja, pára tudo. Mas sem perder nada.
Na sua lógica o que aconteceria se TRAVA() falhasse por algum motivo, mas depois de ter apagado algum registro do conjunto? Era caca na certa. Tudo bem que pode ser até difícil de acontecer, mas eu não dou chance pro azar.
Eu não faço assim. Meu método é diferente e não poderia fazer igual você. Eu limpo o registro inteiro pra só depois apagar. Mas meu esquema é automático. Eu tenho uma função que primeiro bloqueia todos os registros envolvidos e me devolve uma matriz com os números dos registros. Mando essa matriz pra outra função que faz o trabalho sujo. Ela limpa tudo, apaga e desbloqueia. Um por um. Mas só SE todos os registros foram bloqueados. Se falhar um que seja, pára tudo. Mas sem perder nada.
Na sua lógica o que aconteceria se TRAVA() falhasse por algum motivo, mas depois de ter apagado algum registro do conjunto? Era caca na certa. Tudo bem que pode ser até difícil de acontecer, mas eu não dou chance pro azar.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Mas no exemplo que citei o DBUNLOCK() é indiferente, ou não!?
Vejamos:
Código:
SELECT DESDO
DBSETORDER(1)
GOTO TOP
DBSEEK(vPEDIDO)
DO WHILE CODPED = vPEDIDO
TRAVA()
DBDELETE()
DBUNLOCK()
DBSKIP()
ENDDO
DBCOMMITALL()
Dbunlock() e DbCommit() tem finalidades distintas.
Dbcommitall() descarrega todos os buffers
Pesquisando a Biblia do Clipper aqui, encontrei que um simples
GOTO RECNO() descarrega o buffer da area atual (se ele tiver sido modificado)
Finalizando, faça como mencionou nosso querido Sygecom, com a sequencia:
Travar -> Editar ou Deletar -> Descarregar o buffer -> Destravar
Caso o laço seja muito grande (alterações ou deleções), deixe para descarregar ao final da operação. O que está armazenado em buffer é somente o registro atual, por isso um simples GOTO RECNO() resolveria.
Vejamos:
Código:
SELECT DESDO
DBSETORDER(1)
GOTO TOP
DBSEEK(vPEDIDO)
DO WHILE CODPED = vPEDIDO
TRAVA()
DBDELETE()
DBUNLOCK()
DBSKIP()
ENDDO
DBCOMMITALL()
Dbunlock() e DbCommit() tem finalidades distintas.
Dbcommitall() descarrega todos os buffers
Pesquisando a Biblia do Clipper aqui, encontrei que um simples
GOTO RECNO() descarrega o buffer da area atual (se ele tiver sido modificado)
Finalizando, faça como mencionou nosso querido Sygecom, com a sequencia:
Travar -> Editar ou Deletar -> Descarregar o buffer -> Destravar
Caso o laço seja muito grande (alterações ou deleções), deixe para descarregar ao final da operação. O que está armazenado em buffer é somente o registro atual, por isso um simples GOTO RECNO() resolveria.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
Isso é o que sempre se aconselha.Travar -> Editar ou Deletar -> Descarregar o buffer -> Destravar
Mas é sempre bom lembrar a ressalva: numa malha, onde vários registros são alterados, o ideal é deixar o HD parado e fazer o COMMIT apenas após a saída da malha. Caso contrário, a performance cairá. Tanto quanto maior for a quantidade de registros alterados.O que está armazenado em buffer é somente o registro atual, por isso um simples GOTO RECNO() resolveria.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!

