Jump to content
Fórum Script Brasil
  • 0

Commit


Guest programador c++
 Share

Question

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 to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Clientes.Transaction.commit

Permanentemente 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.

Link to comment
Share on other sites

  • 0

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.

Link to comment
Share on other sites

  • 0
Guest programador c++

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

Link to comment
Share on other sites

  • 0

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 compensa

definir 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 instavel

Sã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.

Link to comment
Share on other sites

  • 0
Guest programador c++

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_committed

rec_version

nowait

Obrigado pela ajuda"!

Link to comment
Share on other sites

  • 0
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.

Link to comment
Share on other sites

  • 0
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_committed

rec_version

nowait

esta configuração é importante.

Dê uma olhada nos posts abaixo. São referentes a esta questão:

Atualização De Registros, BD Firebird

MDO 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 link

Abraços

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...