Guest programador c++ Postado Setembro 17, 2007 Denunciar Share Postado Setembro 17, 2007 Pessoal, utilizo o interbase para desenvolvimento.então tenho minhas TIBTable, e quando vou salvar alguma coisa, faço assim: Clientes.post;Gostaria de saber qual a diferença de usar:Clientes.Post;Clientes.Transaction.commitClientes.Transaction.CommitRetaining,Transação.CommitRetaining;P.S: Transação é o nome do meu componente TIBTransaction.Abraços:: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 17, 2007 Denunciar Share Postado Setembro 17, 2007 Clientes.Transaction.commitPermanentemente armazena atualizações, inserções, e deleções de dados associadas com a transação atual, e fins das transações atuais. Chame Commit para armazenar permanentemente no servidor de banco de dados todas as atualizações, inserções, e deleções de dados associadas com a transação atual e então termine a transação. A transação atual é a última transação começada pela chamada StartTransaction. Nota: Antes de chamar Commit ,uma aplicação pode conferir o estado da propriedade de InTransaction. Se na aplicação é chamada Commit, e não há nenhuma transação atual, uma exceção é mostrada.Clientes.Transaction.CommitRetaining,Commita a transação ativa e retém o contexto de transação depois um commit. Chame CommitRetaining para armazenar permanentemente ao servidor de banco de dados todas as atualizações, inserções, e deleções de dados associadas com a transação atual e então retenha o contexto de transação. A transação atual é a última transação começada chamando StartTransaction. Nota: Antes de chamar CommitRetaining, uma aplicação pode conferir o estado da propriedade de InTransaction. Se uma aplicação chama CommitRetaining e não há nenhuma transação atual, uma exceção é mostrada. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Setembro 18, 2007 Denunciar Share Postado Setembro 18, 2007 programador c++, tentando completar o que o colega Jhonas já postou, teria a acrescentar que:- basicamente, a questão seria sobre usar Commit e CommitRetained, já que estou quase certo de que você tenha associado seu componente TIBTransaction (Transacao) à propriedade DefaultTransaction do seu IBDataBase ou, pelo menos, à propriedade Transaction de seus componentes datasets (TIBQuery, TIBTable, ...). Deste modo, chamar o método a partir de Transacao ou utilizando a propriedade Transaction do seu dataset, seria a mesma coisa. Exceto no caso do uso de múltiplas transações (TIBTransaction);- A verificação se há ou não uma transação em andamento é feita através do teste de Transacao.InTransaction;- Se você quiser "commitar" uma informação e continuar alterando o mesmo registro (sem iniciar uma nova transação), você utiliza CommitRetained. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest programador c++ Postado Setembro 18, 2007 Denunciar Share Postado Setembro 18, 2007 Muito obrigado pelas informações.A única dúvida que restou, é da diferença de usar "post" ou "commit" num dataset.As duas opções dão "commit" nos dados de maneira definitiva?Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 18, 2007 Denunciar Share Postado Setembro 18, 2007 Eu uso somente desta maneira, sem usar o commit (mas neste caso usei " Attributes = force write " no interbase), nunca tive problemas: CDS_Atesta.Post; CDS_Atesta.ApplyUpdates(-1); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest programador c++ Postado Setembro 18, 2007 Denunciar Share Postado Setembro 18, 2007 Jhonas, onde eu configuro esta propriedade ( Attributes = force write )? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 18, 2007 Denunciar Share Postado Setembro 18, 2007 Quando voce pede um status do banco de dados voce vai ter essas informações:Database "C:\Dados\DADOS.GDB"Database header page information: Flags 0 Checksum 12345 Generation 316569 Page size 4096 ODS version 10.0 Oldest transaction 316557 Oldest active 316558 Oldest snapshot 316558 Next transaction 316560 Bumped transaction 1 Sequence number 0 Next attachment ID 0 Implementation ID 16 Shadow count 0 Page buffers 0 Next header page 0 Database dialect 3 Creation date Aug 14, 2007 12:20:22 Attributes force write Variable header data: *END*eu uso os seguintes comandos para alterar a escrita ( modo como o interbase fara a escrita dos dados )usando o Attributes force write não tenho preocupação em perder os dados no caso de uma queda de energia ( banco corrompido )por outro lado deixa a rede um pouco mais lenta ... mas compensadefinir uses shellapi; // mudar escrita do banco para modo syncrono WinExec(pchar('cmd.exe /c gfix -write sync -user sysdba -password senha '), 0); // mais estavel, mais lento // mudar escrita do banco para modo asyncrono WinExec(pchar('cmd.exe /c gfix -write async -user sysdba -password senha '), 0); // mais rapido, mais instavelSão esses comandos que alteram a propriedade Attributes; (um deixa mais rapido porem mais instavel, o outro deixa um pouco mais lento porem mais estavel e confiavel) é uma escolha do programador. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest programador c++ Postado Setembro 18, 2007 Denunciar Share Postado Setembro 18, 2007 valeu pela informação Jhonas.Só para concluir.....Com base nas informações prestadas, olhe se meu raciocínio está certo.Quando dou um post na tabela, os dados referentes a esta atualização ficam no arquivo de log do banco de dados, então quando dou um commit, estes dados que estão no arquivo de log, são salvos permanentemente na minha base de dados certo?Neste racicínio, tive outra dúvida.Tentei acessar a base de dados pela rede, e uma máquina não conseguia ver as atualizações que eram feitas na outra. Então, depois que dei o Post da Table, dei um commit, e a outra máquina passou a enxergar os dados que foram alterados.Partindo do princípio que se eu apenas der post, os arquivos ficam no log, e depois que dou um commit estes dados vão para o banco de dados, porque em um ambiente mono-usuário, onde sempre usei só o "post" na table, sem usar o "commit", os dados referentes a transação nunca foram perdidos? É necessário também que eu inicie a transação "start transaction"?P.S: a configuração do meu ibtransaction é: read_committedrec_versionnowaitObrigado pela ajuda"! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Setembro 18, 2007 Denunciar Share Postado Setembro 18, 2007 A única dúvida que restou, é da diferença de usar "post" ou "commit" num dataset.As duas opções dão "commit" nos dados de maneira definitiva?Acho que podemos dizer que o post grava as informações alteradas até sua chamada, entretanto a efetiva gravação no banco de dados, ocorre quando você "commita" a transação.Voce precisa utilizar os dois comandos. Mas observe que você pode definir no seu componente TBTransactin que a transação será comitada automaticamente (propriedade AutoCommit = True), bem como definir qual será o tipo de ação padrão (propriedade DefaultAction), normalmente TACommit ou TACommitRetained.Eu uso somente desta maneira, sem usar o commit (mas neste caso usei " Attributes = force write " no interbase), nunca tive problemas: CDS_Atesta.Post; CDS_Atesta.ApplyUpdates(-1);Jhonas, apenas cuidado para não confundir o colega. Você esta exemplificando com ClientDataSet (CDS) que chama ApplayUpdates com parâmetros, enquanto o colega programador c++ utilizar componentes IBTable que poderia chamar este método, mas sem parâmetros. Lembrando ainda que, para utilizar ApplayUpdates, deveria ser habilitada a propriedade CachedUpdates do dataset. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 18, 2007 Denunciar Share Postado Setembro 18, 2007 Tem razão Micheus .... acho que não preciso acrescentar mais nada. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Setembro 19, 2007 Denunciar Share Postado Setembro 19, 2007 Tentei acessar a base de dados pela rede, e uma máquina não conseguia ver as atualizações que eram feitas na outra. Então, depois que dei o Post da Table, dei um commit, e a outra máquina passou a enxergar os dados que foram alterados.ou seja, você está acessando apenas dados "commitados".Partindo do princípio que se eu apenas der post, os arquivos ficam no log, e depois que dou um commit estes dados vão para o banco de dados, porque em um ambiente mono-usuário, onde sempre usei só o "post" na table, sem usar o "commit", os dados referentes a transação nunca foram perdidos?não saberia explicar exatamente, mas o ambiente mono-usuário pressupõe que apenas uma pessoa está alterando a informação num dado momento. Em "bancos" como paradox, por exemplo não existe implementações sofisticadas como a de verdadeiros Sistemas Gerenciadores de Bancos de Dados (SGBD), onde há recurso que possibilitam e gerenciam a alteração de um mesmo registro por n usuários.É necessário também que eu inicie a transação "start transaction"?eu diria que fica a seu critério. Isto porque se você não o fizer, os componentes em uso automaticamente o farão. Entretanto, nada impede que em situações específicas, você inicie uma nova transação.P.S: a configuração do meu ibtransaction é: read_committedrec_versionnowaitesta configuração é importante.Dê uma olhada nos posts abaixo. São referentes a esta questão:Atualização De Registros, BD FirebirdMDO Transação (a config. da transação é idêntica. MDO é um componente compatível com os da paleta IB, mas otimizado para Firebird)Também tem um artigo sobre o assunto que pode ser interessante ler: "Entendendo os tipos e configurações das transações" (Autor: Claudio Valderrama; Tradução/Adaptação : Carlos Henrique Cantu - FireBase)Obs: Como é necessário registrar-se no site FireBase para acessá-lo, vou deixar uma versão em PDF neste linkAbraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Guest programador c++
Pessoal, utilizo o interbase para desenvolvimento.
então tenho minhas TIBTable, e quando vou salvar alguma coisa, faço assim:
Clientes.post;
Gostaria de saber qual a diferença de usar:
Clientes.Post;
Clientes.Transaction.commit
Clientes.Transaction.CommitRetaining,
Transação.CommitRetaining;
P.S: Transação é o nome do meu componente TIBTransaction.
Abraços::
Link para o comentário
Compartilhar em outros sites
10 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.