Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
При закрытии приложения появилась ошибка:
Project raised exception class EIBCError with message 'cannot disconnect database with open transactions (1 active)'.

Раньше такого не было.
В приложении несколько UniConnection и, соответственно, несколько наборов данных со своими транзакциями.

В ошибке, как видите, нет ссылки на компоненту, откуда лезет исключение :(
здесь рекомендуют:
https://forums.devart.com/viewtopic.php?t=35596#p123776
Check the TUniConnection.DefaultTransaction.DefaultCloseAction, its default is taRollback.
Also TUniConnection.Autocommit, default for FB is True.

так и сделано.


Исключение где-то глубоко в недрах.
Если даже принудительно Disconnect не вызываю, то всё равно вываливает это исключение.
При закрытии даже пробовал принудительно откатить транзакции - не помогает.


Delphi Tokyo
UniDAC 7.1.4
Firebird 3.
8 июл 19, 14:20    [21922710]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
А ларчик просто открывался.
Забыл при закрытии приложения вызвать деструктор класса, где выполнялся Disconnect.
Запутася. Сам виноват.
8 июл 19, 14:38    [21922729]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Но странно, что раньше этой ошибки не возникало.
8 июл 19, 14:40    [21922731]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Всё равно ошибка то появляется, то исчезает.
Такое впечатление, что библиотека сама не закрывает транзакции при разрыве связи.
Возможно, что приложение где-то в процессе работы стартует транзации, но не завершает их, что вполне нормально вроде бы.
8 июл 19, 14:55    [21922754]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
destructor TObjectsSearch.Destroy;
begin
// connNotify TUniConnection

  if Assigned(connNotify) then
  begin
    ShowMessage(connNotify.TransactionCount.ToString);

    if connNotify.Connected then
      connNotify.Disconnect;

    ShowMessage(connNotify.TransactionCount.ToString);

    if connNotify.InTransaction then
      ShowMessage('InTransaction');// это сообщение не появляется

    connNotify.DisposeOf;
  end;


ShowMessage показывает 2 раза значение "3", а это нормально?
И в доках свойство TransactionCount не описано
https://www.devart.com/unidac/docs/devart.unidac.tuniconnection members.htm
8 июл 19, 15:12    [21922764]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
kill_zdm
Member

Откуда:
Сообщений: 1402
Позвольте мое скромное мнение
https://www.devart.com/unidac/docs/devart.unidac.tuniconnection.starttransaction().htm
Мне кажется проблема в уровне изоляции запуска транзакции в случае нештатных последствий соединения , а точнее - на поведение -ждать или откатить или подтвердить. Я бы попробовал, ради интереса, поиграться с параметрами запуска транзакций.
8 июл 19, 15:23    [21922783]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Игрался и доигрался Картинка с другого сайта.

Потом всё вернул всад. Но проблема иногда проявляется. Вот и не могу найти закономерность.


Вообще, хочу сделать, как на фибах: одна транзакция читающая и постоянно открытая, а вторая - пишущая и максимально короткая, т.е. только на время записи.

procedure TObjectsSearch.InitDB;
begin
  connNotify := TUniConnection.Create(nil);
  InterBaseUniProvider1    := TInterBaseUniProvider.Create(connNotify);
  connNotify.ProviderName  := 'InterBase';
  connNotify.ConnectString := fConnectionString;
  connNotify.AutoCommit    := True;

  transW := TUniTransaction.Create(nil);
  transW.IsolationLevel     := ilCustom;
  transW.DefaultCloseAction := taRollback;
  transW.DefaultConnection  := connNotify;
  transW.SpecificOptions.Values['Params'] := 'write;nowait;rec_version;read_committed';

  transR := TUniTransaction.Create(nil);
  transR.IsolationLevel     := ilCustom;
  transR.DefaultCloseAction := taRollback;
  transR.DefaultConnection  := connNotify;
  transR.SpecificOptions.Values['Params'] := 'read;nowait;rec_version;read_committed';

  connNotify.DefaultTransaction := transR;

  connNotify.Connect;

  qQueryValue := TUniQuery.Create(connNotify);
  qQueryValue.Connection := connNotify;
  qQueryValue.Transaction := transR;
  qQueryValue.UpdateTransaction := transW;


может я неправильно создаю и уничтожаю элементы?

destructor TObjectsSearch.Destroy;
begin
  if Assigned(connNotify) then
  begin
    if connNotify.Connected then
      connNotify.Disconnect;
    connNotify.DisposeOf;
  end;

  if Assigned(transW) then
    transW.DisposeOf;

  if Assigned(transR) then
    transR.DisposeOf;


Не в том порядке?
Может нужно принудительно закрывать транзакции? Хотя у компоненты есть же свойство DefaultCloseAction:
https://www.devart.com/unidac/docs/devart.dac.tdatransaction.defaultcloseaction.htm
Use DefaultCloseAction to specify the transaction behaviour when it is destroyed while being active, or when one of its connections is closed with the active transaction.
8 июл 19, 15:43    [21922813]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
X11
Но проблема иногда проявляется. Вот и не могу найти закономерность.
Многопоток?
8 июл 19, 16:05    [21922848]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Ну почти.
Есть основное приложение с двумя соединениями и отдельный поток с ещё одним.
8 июл 19, 16:07    [21922851]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Но я уверен на 99%, что исключение появляется не в отдельном потоке.
Ну т.е. я как бы понял уже из-за какого соединения ошибка, осталдось понять причины и закономерность и как правильно завершать приложение, если UniDAC сама не умеет правильно управлять транзакциями при завершении приложения.
8 июл 19, 16:10    [21922853]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10998
X11
и как правильно завершать приложение,
Судя по сообщению
X11
'cannot disconnect database with open transactions
На момент вызова Disconnect не должно быть активных транзакций. Т.е. либо так
destructor TObjectsSearch.Destroy;
begin
  if Assigned(transW) then
    transW.DisposeOf;

  if Assigned(transR) then
    transR.DisposeOf;

  if Assigned(connNotify) then
  begin
    if connNotify.Connected then
      connNotify.Disconnect;
    connNotify.DisposeOf;
  end;
либо так
destructor TObjectsSearch.Destroy;
begin
  if Assigned(transW) and transW.Active  then  // или transW.InTransaction - смотри как там у них
    transW.Commit;

  if Assigned(transR) and transR.Active then
    transR.Commit;

  if Assigned(connNotify) then
  begin
    if connNotify.Connected then
      connNotify.Disconnect;
    connNotify.DisposeOf;
  end;

  if Assigned(transW) then
    transW.DisposeOf;

  if Assigned(transR) then
    transR.DisposeOf;
8 июл 19, 16:21    [21922864]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
_Vasilisk_
На момент вызова Disconnect не должно быть активных транзакций.

X11
Может нужно принудительно закрывать транзакции? Хотя у компоненты есть же свойство DefaultCloseAction:
https://www.devart.com/unidac/docs/devart.dac.tdatransaction.defaultcloseaction.htm
Use DefaultCloseAction to specify the transaction behaviour when it is destroyed while being active, or when one of its connections is closed with the active transaction.
9 июл 19, 08:20    [21923190]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
или transW.InTransaction - смотри как там у них


InTransaction есть только у UniConnection.
9 июл 19, 10:02    [21923230]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
ок, добавил строку
    if connNotify.InTransaction then
      connNotify.Rollback;

перед отключением - всё равно не помогло решить проблему
9 июл 19, 10:16    [21923240]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Перед отключением добавил ещё
    if transW.Active then
      transW.Rollback;

    if transR.Active then
      transR.Rollback;

не помогает
9 июл 19, 10:19    [21923244]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Кстати, ошибка возникает не на строке
connNotify.Disconnect;

а позже, при завершении работы приложения

К сообщению приложен файл. Размер - 9Kb
9 июл 19, 10:22    [21923247]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Как я полнял, исходя из наблюдений SQL-монитора, создавалось несколько одинаковых TUniConnection, а уничтожалось только одно при закрытии приложения.
9 июл 19, 12:55    [21923360]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1135
Мы ответили вам на нашем форуме: https://forums.devart.com/ru/viewtopic.php?f=26&t=26607
12 июл 19, 14:31    [21925750]     Ответить | Цитировать Сообщить модератору
 Re: UniDAC EIBCError with message 'cannot disconnect database with open transactions'  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30037

ну вот, шо и требовалось доказать...

Posted via ActualForum NNTP Server 1.5

12 июл 19, 15:40    [21925825]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить