Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniDAC EIBCError with message 'cannot disconnect database with open transactions' / 19 сообщений из 19, страница 1 из 1
08.07.2019, 14:20
    #39834979
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
При закрытии приложения появилась ошибка:
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
08.07.2019, 14:38
    #39834986
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
А ларчик просто открывался.
Забыл при закрытии приложения вызвать деструктор класса, где выполнялся Disconnect.
Запутася. Сам виноват.
...
Рейтинг: 0 / 0
08.07.2019, 14:40
    #39834988
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
Но странно, что раньше этой ошибки не возникало.
...
Рейтинг: 0 / 0
08.07.2019, 14:55
    #39835005
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
Всё равно ошибка то появляется, то исчезает.
Такое впечатление, что библиотека сама не закрывает транзакции при разрыве связи.
Возможно, что приложение где-то в процессе работы стартует транзации, но не завершает их, что вполне нормально вроде бы.
...
Рейтинг: 0 / 0
08.07.2019, 15:12
    #39835013
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
Код: 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
08.07.2019, 15:23
    #39835028
kill_zdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
Позвольте мое скромное мнение
https://www.devart.com/unidac/docs/devart.unidac.tuniconnection.starttransaction().htm
Мне кажется проблема в уровне изоляции запуска транзакции в случае нештатных последствий соединения , а точнее - на поведение -ждать или откатить или подтвердить. Я бы попробовал, ради интереса, поиграться с параметрами запуска транзакций.
...
Рейтинг: 0 / 0
08.07.2019, 15:43
    #39835050
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
Игрался и доигрался


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


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

Код: 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
08.07.2019, 16:05
    #39835072
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
X11Но проблема иногда проявляется. Вот и не могу найти закономерность.Многопоток?
...
Рейтинг: 0 / 0
08.07.2019, 16:07
    #39835074
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
Ну почти.
Есть основное приложение с двумя соединениями и отдельный поток с ещё одним.
...
Рейтинг: 0 / 0
08.07.2019, 16:10
    #39835076
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
Но я уверен на 99%, что исключение появляется не в отдельном потоке.
Ну т.е. я как бы понял уже из-за какого соединения ошибка, осталдось понять причины и закономерность и как правильно завершать приложение, если UniDAC сама не умеет правильно управлять транзакциями при завершении приложения.
...
Рейтинг: 0 / 0
08.07.2019, 16:21
    #39835081
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
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
09.07.2019, 08:20
    #39835300
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
_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
09.07.2019, 10:02
    #39835328
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniDAC EIBCError with message 'cannot disconnect database with open transactions'
или transW.InTransaction - смотри как там у них

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


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

    if transR.Active then
      transR.Rollback;


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

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


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