Pourquoi parfois je reçois une exception «Objet de transaction invalide»?

StackOverflow https://stackoverflow.com/questions/420022

  •  05-07-2019
  •  | 
  •  

Question

Quelque chose ne va pas avec ce code?
Parfois, je reçois un " Objet de transaction invalide " non géré. exception:

procedure BlaBla;
var
  TD: TDBXTransaction;
begin
  TD := SQLConnection.BeginTransaction;
  try
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.CommitFreeAndNil(TD);
  except
    SQLConnection.RollbackFreeAndNil(TD);
  end;
end;

Cette exception est générée par l'utilisateur. Je suppose donc qu'elle a été soulevée par RollbackFreeAndNil, car tout le reste se trouve à l'intérieur d'un try..except.

Dois-je envelopper RollbackFreeAndNil avec un autre essai ... sauf? Quel gâchis.

J'utilise Delphi 2009, DBX avec Firebird 2.1 et le pilote Devart.

Était-ce utile?

La solution 2

Le problème est que SQLConnection.BeginTransaction renvoie la valeur nil si SQLConnection n’est pas connecté à la base de données. Et puis j'obtiens l'exception de l'objet transaction invalide.

Je ne m'y attendais jamais. Il faut essayer de connecter ou de lever une exception. Rendre le néant n'a pas de sens pour moi.

Autres conseils

Que se passerait-il si CommitFreeAndNil levait une exception?

RollbackFreeAndNil serait appelé. La TD serait-elle valide alors?

Vous êtes en train de manger l'exception, et donc la preuve. Ne fais pas ça re-lancer:

procedure BlaBla;
var
  TD: TDBXTransaction;
begin
  TD := SQLConnection.BeginTransaction;
  try
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.ExecuteDirect('some sql command');
  except
    SQLConnection.RollbackFreeAndNil(TD);
    raise;
  end;
  SQLConnection.CommitFreeAndNil(TD);
end;

Parfois, vous exécutez des procédures varius avec un composant comme cxdbmemo et vous vous trompez. Vous devez supprimer ce composant (ou quelque chose comme cela) et effectuer votre transaction normalement.

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top