Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Transações não concluidas
Message
De
10/09/2005 23:19:47
Peter Wagner
Point Informática Ltda.
Limeira, Brésil
 
 
À
10/09/2005 09:52:32
Information générale
Forum:
Visual FoxPro
Catégorie:
Base de données, Tables, Vues, Index et syntaxe SQL
Versions des environnements
Visual FoxPro:
VFP 9
OS:
Windows XP SP2
Network:
Windows 2000 Server
Database:
MS SQL Server
Divers
Thread ID:
01048390
Message ID:
01048495
Vues:
19
Marcelo,
em lugar de usar esta linha de código:
If SQLExec(gnConnHandle,"begin transaction") < 0
vc deve inicializar uma transação fazendo com que o VFP informe isto ao SQL Server da seguinte maneira:
* Define o tipo de transação  p/ controle pelo VFP e não do Servidor
= SQLSETPROP(nID, 'TRANSACTIONS', 2) && MANUAL
* agora vc pode enviar instruções ao SQL Server.
llRetorno = SQLExec(gnConnHandle,"seu comando bla bla bla")
IF llRetorno
= SQLCOMMIT(nID)
ELSE
= SQLROLLBACK(nID)
ENDIF
Da uma olhada no Help do VFP em SQLSETPROP().
Desta forma se vc estiver no meio de uma transação e a conexão cair a toda transação é automaticamente retornada pelo SQL Server (Rollback Transaction).

[ ]'s
Peter


>Ola, estou utilizando o seguinte esquema de transação no sql server:
> > llGravacaoOK=.T.
>
> If SQLExec(gnConnHandle,"begin transaction") < 0
> Messagebox("Impossivel iniciar transação",48,"Atenção")
> Return
> Endif
>
> Try
>
>
> m.xparc = 0
> Scan All
> lcCmd="Insert into fatpag50 (filial_id,fatura_id,fornec_id,tipo,numero,valor,emissao,vencto,"+;
> "historico,fluxo,datalan) values (?gcEmpresa,0,?view_pesquisafornecedores.fornec_id,"+;
> "?tipodoc.tipo,?.txtnumero.Value,?cur_parc.valor,?.txtemissao.Value,?cur_parc.vencto,"+;
> "?.txthistorico.Value,?.txtfluxo.Value,?Date())"
> If SQLExec(gnConnHandle,lcCmd) < 0
> Aerror(aErroSQL)
> =Messagebox("Erro ao inserir registro no fatpag50 : "+aErroSQL(2),48,"Atenção")
> llGravacaoOK=.F.
> Endif
>
> Select cur_parc
>
> Endscan
>
> Catch To oExcecao && Trata o erro
>
> Messagebox("Houve um erro!"+Chr(13)+;
> "Erro: "+Transform(oExcecao.ErrorNo)+Chr(13)+;
> "Mensagem: "+oExcecao.Message+Chr(13)+Chr(13)+;
> " : Operação sera revertida!!!!",0+16,"Ajuda")
>
> llGravacaoOK=.F.
>
> Endtry
>
> If llGravacaoOK=.T.
> Wait Window [Commit Transaction] Timeout .5
> If SQLExec(gnConnHandle,"commit") < 0
> Messagebox("Impossivel finalizar transação",48,"Atenção")
> Return
> Endif
> Else
> Wait Window [Rollback Transaction] Timeout .5
> = SQLExec(gnConnHandle,"rollback")
> Endif
>
>***
>
>Funciona tudo perfeitamente, o problema é que as tabelas envolvidas na transação sofrem um lock pelo banco até que seje enviado o commit ou o rollback finalizando a transação! até ai sem problemas o problema é quando cai a conexão as tabelas ficam travadas para outros usuarios! como posso tratar isso? pois hoje tenho que dar um stop e re-star no sql, pra liberar a conexoes e transações, nada inteligente, tem alguma comando pra enviar antes da transação avisao que se a conexao quebrar a transação dever ser revertida automaticamente???
>
>Marcelo.
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform