¿Por qué a veces recibo un & # 8220; Objeto de transacción no válido & # 8221; ¿excepción?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

¿Hay algún problema con este código?
A veces obtengo un objeto de transacción " Inválido no válido " excepción en ella:

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;

Esta excepción se presenta al usuario, por lo que asumo que RollbackFreeAndNil la genera, ya que todo el resto está dentro de un intento ... excepto.

¿Debería envolver RollbackFreeAndNil con otro intento ... excepto? Qué desastre.

Estoy usando Delphi 2009, DBX con Firebird 2.1 y el controlador de Devart.

¿Fue útil?

Solución 2

El problema es que SQLConnection.BeginTransaction devuelve nulo si SQLConnection no está conectado a la base de datos. Y luego obtengo la excepción de objeto de transacción no válido.

Nunca esperé eso. Debería intentar conectarse o plantear una excepción. Volver a cero no tiene sentido para mí.

Otros consejos

¿Qué pasaría si CommitFreeAndNil lanzó una excepción?

RollbackFreeAndNil se llamará. ¿Sería TD válido entonces?

Estás comiendo la excepción, y por lo tanto la evidencia. No hagas eso volver a tirar:

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;

algunas veces es que ejecutas varios procedimientos con un componente como cxdbmemo y le das un error. Debe eliminar ese componente (o algo así) y hacer su transacción normal.

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top