как и здесь:Project raised exception class EIBCError with message 'cannot disconnect database with open transactions (1 active)'
https://forums.devart.com/viewtopic.php ... 63#p123863
Но закономерность не могу выяснить.
Т.е. получается, что на момент закрытия приложения есть одна (всегда одна) активная транзакция.
Если у компоненты-транзакции (TUniTransaction) есть свойство DefaultCloseAction, то оно должно работать.
Есть класс, в котором одно соединение TUniConnection и две транзакции TUniTransaction: одна читающая и одна пишущая.
Идея такая же, как у библиотеки FibPlus: читающая транзация постоянно открыта, а пишущая транзакция постоянно закрыта и открывается только на момент запись данных в базу, т.е. она максимально короткая.
Код: Выделить всё
procedure TObjectsSearch.InitDB;
begin
connNotify := TUniConnection.Create(nil);
InterBaseUniProvider1 := TInterBaseUniProvider.Create(connNotify);
connNotify.ProviderName := 'InterBase';
connNotify.ConnectString := fConnectionString;
connNotify.AutoCommit := False;
transW := TUniTransaction.Create(connNotify);
transW.IsolationLevel := ilCustom;
transW.DefaultCloseAction := taRollback;
transW.DefaultConnection := connNotify;
transW.SpecificOptions.Values['Params'] := 'write;nowait;rec_version;read_committed';
transR := TUniTransaction.Create(connNotify);
transR.IsolationLevel := ilCustom;
transR.DefaultCloseAction := taRollback;
transR.DefaultConnection := connNotify;
transR.SpecificOptions.Values['Params'] := 'read;nowait;rec_version;read_committed';
connNotify.DefaultTransaction := transR;
connNotify.Connect;
Код: Выделить всё
destructor TObjectsSearch.Destroy;
begin
if Assigned(connNotify) then
begin
if connNotify.InTransaction then
connNotify.Rollback;
if connNotify.Connected then
connNotify.Disconnect;
connNotify.DisposeOf;
end;
inherited;
end;
Спасибо.
Delphi Tokyo, Firebird 3, UniDAC 7.1.4.