Transação

20/05/2008

1

Amigos, tenho uma transação que funciona em todos os forms exceto um. Inicio, commito ou dou rollback. Acontece, que este form, tem um try grande, com várias procedures sendo chamada. E no final do try, eu tenho um Update. Simuleu erro nesse Update, como sempre faço para testar, e mesmo a transação entrando no RollBack, as procedures dão Insert nas tabelas. Havia uns ApplyUpdates, removi, pois poderia soar como um Commit, mas mesmo assim, continua commitando, mesmo indo para o Rollback no final. Em outros forms, funciona. Achei que poderia ser as procedures dando INSERT e EXECUTE fora da minha procedure onde chamo a Transação, mas não pode ser, pois depois de aberto uma Transação, qualquer situação de banco, estará dentro da Trasação, certo? Desta forma, não sei o que pode estar acontecendo.


Responder

Posts

20/05/2008

Paulo

Tenho uma procedure sendo chamada de dentro da transação chamada de: [color=red:1a67e623ad]InicializaTabelas;[/color:1a67e623ad]Abaixo o codigo dessa procedure que sendo executada, mesmo com Rollback da transação, pois simulo o erro e entra no Rollback.

procedure TFrmEncerramento.InicializaTabelas; begin cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_RES_CAR´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_CHEQUE_PRE´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_TROCA´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_NF_DADOS_ADICIONAIS´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_NF_FATURA´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_NF_DESTINATARIO´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_NF_PAGAMENTO´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_NF_ITEM´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_NF_CAPEADOR´; cds.Execute; cds.Close; cds.CommandText := ´´; cds.CommandText := ´ delete from TB_SAC_LOG´; cds.Execute; cds.Close; MM_Fechamento.Lines.add(´Inicialização dos movimentos realizada.´); end;



Responder

20/05/2008

Joaoshi

Colega, se entendi direito, você deveria ter uma Transação antes dos procedimentos.

Ex.:

-SqlConnection1.[b:19c5e63ec0]StartTransaction[/b:19c5e63ec0](TransactionID);
-Executa Processos
-Deu tudo certo:
-- SQLConnection1.Commit(TransactionID);
-Deu errado:
-- SQLConnection1.Rollback(TransactionID);

Espero ter ajudado.


Responder

20/05/2008

Paulo

Mas é isto que existe. Tanto que em todos os meu forms funciona, exceto esse que falei. A função IniciaTransacao, ela da o Start no banco e as demais fazem o Commit ou Rollback. Exatamente como está no post acima.


Responder

20/05/2008

Paullsoftware

É estranho, pois, a sintax é exatamente como o nosso amigo [b:5c39c7e8f3]joaoshi[/b:5c39c7e8f3], seria bom você ir testando uma por uma as rotinhas até encontrar onde está o erro!


Responder

20/05/2008

Paulo

O Problema, é que entra na Transação~, entra no RollBack e nada acontece. Eu comentei o IniciaTransacao e commitou sem da erros. Já debuguei o meu servidor e o cliente e nada. Achei que tivesse apontando para outro RDM, mas não e mesmo se tivesse, no meu servidor eu sõ tenho um único SqlConnection. No meu cliente eu só tenho um único Socket, então descarto a possibilidade de startar uma transacao que esteja fora do escopo. Não sei o que pode ser.


Responder
as rotinas que funcionam também executam a partir do cliente?

esses procedimento estão protegidos num bloco try..except ?

porque se estiverem num bloco try..except, eles podem não estar ´protegidos´ corretamente. Por quê? Porque certos erros do clientdataset NÃO geram exceções.

o correto seria você tratar o evento ReconcileError e setar alguma variável, caso houvesse erro; ou a partir do ReconcileError gerar uma exceção com a mensagem retornada pelo provider.


Responder

21/05/2008

Paulo

As rotinas são iguais. Para eu testar aqui, eu fiz assim: Coloquei um botão, e coloquei dois Insert apenas, dentro de um bloco Try...Except, e não funcionou. Peguei o mesmo código, o mesmo mesmo, coloquei em outro form e funcionou. Debugeui o servidor e a transação é Startada e Comitada ou Rolbequeada. Dá a impressão, que este Form não está usando o mesmo SqlConnection, porem eu só tenho um SqlConnection. Como foi outra pessoa que o desenvolveu(O Form), eu agora vou abrir linha a linha do servidor e ver se há algo diferente. Já fiz isso e não vi nada, mas agora vou fazer de outra forma. O problema com certeza está no SharedConnection deste form e vou fazer uma varredura fina no form Cliente e nos RDM do Servidor. É só este form, já os outros funcionam e a função de Startar, Comitar e Rolbequear é a mesma para todos, lida da mesma Unit. E a função de Servido está no RDM principal, pois eu só tenho um SqlConnection, pelo menos deveria estar assim, mas como outras pessoas mexem também, pode ser que alguém fez diferente do projeto original.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira