COMMIT NO FIREBIRD

MARCELO.VB.PIRA 08/07/2010 19:47:31
#346912
Olá amigos...

meu sistema é em VB6 e o bd em firebird 2.1

estou revendo todo o projeto em busca de begins sem commmit. mas até lá gostaria de saber de algum comando que desse um commit GERAL em todas as transações pendentes...

quando abro o bd pelo IB Expert, la na barra de status aparece:

Citação:

restam trocentas modificações da tabela clientes



mesmo usando o

Citação:

gfix -commit all base.fdb



, quando abro o bd pelo ib expert esses commits abertos continuam lá...

OBVIO que sei que devo resolver a causa do problema (meu codigo), mas até lá estou tendo um monte de deadlocks, travamentos, etc nos clientes.

o interessante é que a opção SuaConexao.commit parece fechar todas as transações abertas mas cada tabela tem uma quantidade diferente de commits abertos

alguem sabe algum comando que pudesse fechar todas as transações ainda abertas?

Obrigado.

LLAIA 08/07/2010 21:49:00
#346919
se o gfix não resolveu então tá difcil hein. não seria um bug do ibexpert ?

[txt-color=#0000f0]já experimentou assim: gfix -user SYSDBA -password masterkey dbserver:/db/mydb.fdb -commit all[/txt-color]

experimente também o parâmetro -list , pra ver se existem mesmo transações no limbo, e se o comando anterior realmente é necessário.

dá uma olhada nesse link
http://firebirdlikebrasil.wordpress.com/
MARCELO.VB.PIRA 09/07/2010 08:52:57
#346931
Obrigado pela dica, mas não resolveu...

Mesmo usando outro front end alem do IB Expert (SQL Manager, por exemplo), o problema persiste.

Será que não existirá uma ferramenta que feche todos esses commmits abertos, até que eu resolva a causa deles no meu código?



MARCELO.VB.PIRA 09/07/2010 09:05:54
#346937
Alguém sabe para que serve os comandos abaixo?

Enable Forced Writes: gfix -user SYSDBA -password masterkey dbserver:/db/mydb.fdb -write sync

Disable Forced Writes: gfix -user SYSDBA -password masterkey dbserver:/db/mydb.fdb -write async

Sweep Database now: gfix -user SYSDBA -password masterkey dbserver:/db/mydb.fdb -sweep

Será que algum deles não resolveria esses commits perdidos?

LLAIA 10/07/2010 12:16:12
#347003
Sobre forced writes:

http://www.sinatica.com/blog/br/index.php/artigos/forced-writes-quando-usar

*********************************************************************************************************************************************************

Extrai isso do Firebase.com.br http://www.firebase.com.br/fb/artigo.php?id=3

1. Defina as seguints variáveis para tornar o processo mais fácil pois voce não terá que digitar toda hora o usuário e a senha.

SET ISC_USER=SYSDBA

SET ISC_PASSWORD=masterkey

2. Sempre tenha certeza de estar trabalhando com uma cópia do BD e não o arquivo original. Use o sistema operacional para fazer uma cópia do arquivo. Voce deve ter acesso exclusivo ao BD para fazer isso.

copy employee.gdb database.gdb

3.Agora confira se o BD está corrompido. Voce precisa ter acesso exclusivo ao BD para fazer isso, mas como voce está trabalhando com uma cópia do BD original, isso não é problema.

gfix -v -full database.gdb

4. Se o comando anterior indicou que há um problema com o BD, agora nós devemos repara-lo.

gfix -mend -full -ignore database.gdb

5.O próximo passo é conferir se o BD foi reparado.

gfix -v -full database.gdb

6. Se o BD continua com erros, voce deve fazer um backup completo e restaura-lo. No seu estilo mais simples, a linha de comando do backup pode ser :

gbak -backup -v -ignore database.gdb database.gbk

7. No entanto, se o gbak falhar porque está tendo problemas com garbage collection, então use o seguinte comando :

gbak -backup -v -ignore -garbage database.gdb database.gbk

8. Se houver corrupção nas versões dos registros de uma transação em limbo, então voce deve incluir a opção -limbo :

gbak -backup -v -ignore -garbage -limbo database.gdb database.gbk

9. Agora crie um novo BD do backup:

gbak -create -v atlas.gbk atlas_new.gdb


**************************************************************************************************************
O Sweep limpa as versões inutilizadas dos registros do banco de dados. Pode ser uma tentativa.


ARNALDOCRUZ 11/07/2010 14:24:16
#347038
Resposta escolhida
Outra solução garantida de concerto do Banco de dados é a seguinte.

1 - clique na primeria tabela.
2 - clique na aba DDL
3 - copie o codigo de create TBL e o alter tabela sel o codigo das triggres
4 * Cole no bloco de Notas, dando o nome da tabela e extensão ---- tabela.sql
5 - copie o codigo das as trigger e cole em um txt qualquer(dê um nome para triggers --- tabela.sql.
6 - Clique na aba Data
7 - Clique com o Lado direito do Mouse
8 - Selecione DataManipulation
9 - Selecione Export [ô]NOME DA TABELA[ô] para SQL Script

Faça isso para todas as tabelas

10 - Faça uma cópia do Banco de dados e guarde em uma outra pasta
11 - Desregistre o Banco de Dados do gerenciador
12 - Delete o Banco de Dados

13 - Abra o gerenciador
14 - Crie um banco de dados vazio
15 - No menu , selecione Tools \SQL Script
16 - Open Script -- Selecione o sql da criação das tabelas - faça~isso para todas as tabelas.

Pronto as tabelas estão criadas.

17 - No menu , selecione Tools \SQL Script
18 - Open Script -- Selecione o sql de inclusão de registros - faça~isso para todas as tabelas.
19 - Abra a tabela no modo DATA e dê um refresh

Pronto o Banco de dados está criados e todos os rgeistros incluídos e sem nemhum erro.

Outra solução.

1 - Verifique quais tabelas ocorrem o problema do travamento
2 - Abra o gerenciador
3 - sem se conectar ao BD faça um backup
4 - Faça uma restauração

Obs neste processo tem opção de refazer indices, finalizar beginstrans em aberto etc.

5 - Execute o processo da primeira solução só para as tabelas com problemas de travamento.

Dica.

No banco de dados crie esta procedure abaixo, basta ir em script colar e executar

CREATE PROCEDURE SP_GERADOR(
PNOME VARCHAR(50) CHARACTER SET WIN1252)
RETURNS(
PVALOR INTEGER)
AS
DECLARE VARIABLE vSTM VARCHAR(500);
BEGIN
vSTM = [ô]SELECT NEXT VALUE FOR [ô] || :pNOME || [ô] FROM RDB$DATABASE[ô];
EXECUTE STATEMENT vSTM INTO :pVALOR;
SUSPEND;
END

Para campo PrimaryKey faça incremetação como abaixo, encarregando este processo evita mutos erros.

crie um generator como abaixo

CREATE GENERATOR GEN_TBLALIQUOTA;

substitua GEN_TBLALIQUOTA por GEN_nomedasua tabela

quando for incluir um registro, no código do seu sistema

Set Rs1 = Cnn.Execute([Ô]SELECT * from SP_GERADOR([ô]GEN_TBLFORNECEDOR[ô])[Ô])
Dim Result As String
Result = Rs1.Fields(0)
Rs1.Close
Set Rs1 = Nothing

Result = o proximo numero a ser incrementado no campo ID

Outra Dica fazer Inclusão e edição por store procedure

segue exemplo abaixo de uma procedure de inclusão,alteração e exclu~soa de uma tagbela chamada Banco

no banco de dados

CREATE PROCEDURE SP_TBLBANCO (
pID D_CPONUMVAL0,
pTIPO D_FJ,
pAGENCIA D_AGENCIA,
pBANCO D_TELEFONE,
pCONTATO D_TELEFONE,
pTELEFONE D_TELEFONE
)
AS
BEGIN
IF (:pTIPO = [ô]I[ô]) THEN
INSERT INTO TBLBANCO
(ID,AGENCIA,BANCO,CONTATO,TELEFONE)
VALUES(:pID,:pAGENCIA, :pBANCO,:pCONTATO,
:pTELEFONE);
IF (:pTIPO = [ô]A[ô]) THEN
UPDATE TBLBANCO SET AGENCIA = :pAGENCIA,
BANCO = :pBANCO,
CONTATO = :pCONTATO,
TELEFONE = :pTELEFONE
WHERE ID = :pID;
IF (:pTIPO = [ô]E[ô]) THEN
DELETE FROM TBLBANCO
WHERE ID = :pID;
END;

no Código do Sistema


On Error GoTo tbl
Cnn.BeginTrans
Dim cmd As New ADodb.Command
Dim pSTR As ADodb.Parameter
Set Rs1 = Cnn.Execute([Ô]SELECT * from SP_GERADOR([ô]GEN_TBLBANCO[ô])[Ô])
Dim Result As String
Result = Rs1.Fields(0)
Rs1.Close
Set Rs1 = Nothing
Set pSTR = cmd.CreateParameter([Ô]pID[Ô], adInteger, adParamInput, , Result)
cmd.Parameters.Append pSTR
Set pSTR = cmd.CreateParameter([Ô]pTPO[Ô], adVarChar, adParamInput, 1, [Ô]I[Ô]) - passo [ô]I[ô] para Incluir - [ô]A[ô] para Alterar e [ô]E[ô] para excluir somente o primeiro e segundo parametro
cmd.Parameters.Append pSTR
Set pSTR = cmd.CreateParameter([Ô]pAGENCIA[Ô], adVarChar, adParamInput, 30, Me.Agencia)
cmd.Parameters.Append pSTR
Set pSTR = cmd.CreateParameter([Ô]pBANCO[Ô], adVarChar, adParamInput, 20, Me.Banco)
cmd.Parameters.Append pSTR
Set pSTR = cmd.CreateParameter([Ô]pCONTATO[Ô], adVarChar, adParamInput, 20, IIf(Me.Contato = [Ô][Ô] Or IsNull(Me.Contato), VAZ, Me.Contato))
cmd.Parameters.Append pSTR
Set pSTR = cmd.CreateParameter([Ô]pTELEFONE[Ô], adVarChar, adParamInput, 20, IIf(Me.Telefone = [Ô][Ô] Or IsNull(Me.Telefone), VAZ, Me.Telefone))
cmd.Parameters.Append pSTR
With cmd
.ActiveConnection = Cnn
.CommandType = adCmdStoredProc
.CommandText = [Ô]SP_TBLBANCO[Ô]
.Execute
End With
Set pSTR = Nothing
Cnn.CommitTrans
Limpar
AtualizaDados - Preenche um grid já com o registro adicionado
MsgBox [Ô]Inclusão efetuada com sucesso[Ô], vbInformation, [Ô]Aviso do Sistema[Ô]
Me.Agencia.SetFocus
Exit Sub
tbl:
Err.Clear
Cnn.RollbackTrans
MsgBox [Ô]Os dados não foram gravados[Ô], vbInformation, [Ô]Aviso do sistema[Ô]





Tópico encerrado , respostas não são mais permitidas