powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniDAC EIBCError with message 'cannot disconnect database with open transactions'
19 сообщений из 19, страница 1 из 1
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39834979
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При закрытии приложения появилась ошибка:
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.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39834986
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ларчик просто открывался.
Забыл при закрытии приложения вызвать деструктор класса, где выполнялся Disconnect.
Запутася. Сам виноват.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39834988
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но странно, что раньше этой ошибки не возникало.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835005
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё равно ошибка то появляется, то исчезает.
Такое впечатление, что библиотека сама не закрывает транзакции при разрыве связи.
Возможно, что приложение где-то в процессе работы стартует транзации, но не завершает их, что вполне нормально вроде бы.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835013
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835028
kill_zdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Позвольте мое скромное мнение
https://www.devart.com/unidac/docs/devart.unidac.tuniconnection.starttransaction().htm
Мне кажется проблема в уровне изоляции запуска транзакции в случае нештатных последствий соединения , а точнее - на поведение -ждать или откатить или подтвердить. Я бы попробовал, ради интереса, поиграться с параметрами запуска транзакций.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835050
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игрался и доигрался


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


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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
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;



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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835072
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Но проблема иногда проявляется. Вот и не могу найти закономерность.Многопоток?
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835074
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну почти.
Есть основное приложение с двумя соединениями и отдельный поток с ещё одним.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835076
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но я уверен на 99%, что исключение появляется не в отдельном потоке.
Ну т.е. я как бы понял уже из-за какого соединения ошибка, осталдось понять причины и закономерность и как правильно завершать приложение, если UniDAC сама не умеет правильно управлять транзакциями при завершении приложения.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835081
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11и как правильно завершать приложение,Судя по сообщению
X11'cannot disconnect database with open transactionsНа момент вызова Disconnect не должно быть активных транзакций. Т.е. либо так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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;

либо так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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;
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835300
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835328
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или transW.InTransaction - смотри как там у них

InTransaction есть только у UniConnection.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835335
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, добавил строку
Код: pascal
1.
2.
    if connNotify.InTransaction then
      connNotify.Rollback;


перед отключением - всё равно не помогло решить проблему
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835338
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед отключением добавил ещё
Код: pascal
1.
2.
3.
4.
5.
    if transW.Active then
      transW.Rollback;

    if transR.Active then
      transR.Rollback;


не помогает
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835340
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, ошибка возникает не на строке
connNotify.Disconnect;

а позже, при завершении работы приложения
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39835411
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я полнял, исходя из наблюдений SQL-монитора, создавалось несколько одинаковых TUniConnection, а уничтожалось только одно при закрытии приложения.
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39836856
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы ответили вам на нашем форуме: https://forums.devart.com/ru/viewtopic.php?f=26&t=26607
...
Рейтинг: 0 / 0
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
    #39836893
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот, шо и требовалось доказать...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniDAC EIBCError with message 'cannot disconnect database with open transactions'
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]