Perché a volte ricevo un oggetto transazione & # 8220; Invalid & # 8221; eccezione?

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

  •  05-07-2019
  •  | 
  •  

Domanda

C'è qualcosa di sbagliato in questo codice?
A volte ricevo un oggetto di transazione non gestito " Invalid " eccezione in esso:

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;

Questa eccezione viene sollevata per l'utente, quindi suppongo sia stata sollevata da RollbackFreeAndNil, poiché tutto il resto è all'interno di un try..except.

Dovrei avvolgere RollbackFreeAndNil con un altro tentativo ... tranne? Che casino.

Sto usando Delphi 2009, DBX con Firebird 2.1 e il driver Devart.

È stato utile?

Soluzione 2

Il problema è che SQLConnection.BeginTransaction restituisce zero se SQLConnection non è connesso al database. E poi ottengo l'eccezione dell'oggetto transazione non valido.

Non me l'aspettavo mai. Dovrebbe tentare di connettersi o sollevare un'eccezione. Restituire zero non ha senso per me.

Altri suggerimenti

Cosa succederebbe se CommitFreeAndNil generasse un'eccezione?

Sarebbe chiamato RollbackFreeAndNil. TD sarebbe valido allora?

Stai mangiando l'eccezione, e quindi le prove. Non farlo; ri-tiro:

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;

alcune volte è che esegui varie procedure con un componente come cxdbmemo e ti dà questo errore. Devi rimuovere quel componente (o qualcosa del genere) e fare la tua transazione normale.

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top