때때로 "잘못된 트랜잭션 객체"예외를 얻는 이유는 무엇입니까?

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

  •  05-07-2019
  •  | 
  •  

문제

이 코드에 문제가 있습니까?
때때로 나는 그것에 도달되지 않은 "유효하지 않은 트랜잭션 객체"예외를 얻는다 :

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;

이 예외는 사용자에게 제기되고 있으므로 RollbackFreeAndnil에 의해 제기된다고 가정합니다.

다른 시도로 RollbackFreeAndnil을 래핑해야합니까? 얼마나 혼란.

Delphi 2009, Firebird 2.1과 Devart의 드라이버와 함께 DBX를 사용하고 있습니다.

도움이 되었습니까?

해결책 2

문제는 sqlconnection.begintransaction이 데이터베이스에 연결되어 있지 않으면 nil을 반환한다는 것입니다. 그런 다음 유효하지 않은 트랜잭션 객체를 제외하고 있습니다.

나는 그것을 기대하지 않았다. 연결하거나 예외를 제기해야합니다. NIL을 반환하는 것은 나에게 의미가 없습니다.

다른 팁

Commitfreeandnil이 예외를 던지면 어떻게 될까요?

Rollbackfreeandnil이 호출됩니다. 그렇다면 TD가 유효합니까?

당신은 예외를 먹고 있기 때문에 증거입니다. 그렇게하지 마십시오. 재단 :

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;

때로는 CXDBMemo와 같은 구성 요소로 Varius 프로 시저를 실행하고 오류를 제공합니다. 해당 구성 요소 (또는 이와 같은 일)를 제거하고 거래를 정상화해야합니다.

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top