COMMIT NO FIREBIRD
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:
mesmo usando o
, 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.
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.
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/
[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/
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?
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?
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?
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?
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.
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.
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[Ô]
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