Erick Sasse
Erick Sasse

Reputation: 2819

Why sometimes I get an "Invalid transaction object" exception?

Is there something wrong with this code?
Sometimes I get an unhandled "Invalid transaction object" exception in it:

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;

This exception is being raised to the user, so I assume it's raised by RollbackFreeAndNil, since all rest is inside a try..except.

Should I wrap RollbackFreeAndNil with another try..except? What a mess.

I'm using Delphi 2009, DBX with Firebird 2.1 and Devart's driver.

Upvotes: 1

Views: 3096

Answers (4)

Adelson
Adelson

Reputation: 1

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);

Upvotes: 0

maximo
maximo

Reputation: 11

some times is that you execute varius procedures with a component like cxdbmemo and give you thats error. You have to remove that component (or somthing like this) and do your transaction normal.

Upvotes: 1

Erick Sasse
Erick Sasse

Reputation: 2819

The problem is that SQLConnection.BeginTransaction returns nil if SQLConnection is not Connected to the database. And then I get the exception of invalid transaction object.

I never expected that. It should try to connect or raise an exception. Returning nil doesn't make sense to me.

Upvotes: 3

Craig Stuntz
Craig Stuntz

Reputation: 126547

What would happen if CommitFreeAndNil threw an exception?

RollbackFreeAndNil would be called. Would TD be valid then?

You're eating the exception, and hence the evidence. Don't do that; re-throw:

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;

Upvotes: 4

Related Questions