Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Firedac master-detail зависшая транзакция  [new]
jeykey84
Member

Откуда:
Сообщений: 6
Добрый день.
Вопрос в большей степени к Dmitry Arefiev
Используется среда разработки Embarcadero® Delphi 10.1 Berlin Version 24.0.25048.9432
БД: Firebird 2.5
На сервере приложений при помощи FireDac (FDQuery) используется связка Master-detail (FDQuery1 -> DataSource -> FDQuery2)
На клиент все это дело передается через один TDataSetProvider.
На клиенте разворачивается соответственно в ClientDataSet1 (master) и ClientDataSet2 (detail)
Проблема возникает если в master таблице нет записей.
В этом случае возникает зависшая транзакция и все изменения начинают происходить в рамках этой транзакции, соответственно в БД они записываются после закрытия клиента.

Картинка с другого сайта.

Может у FDQuery есть какая-то волшебная галочка, которая исправляет эту проблему?
Я сделал тестовые БД и пример, который воспроизводится в дизайн-тайме.

К сообщению приложен файл (FDTest.zip - 98Kb) cкачать
4 сен 19, 15:22    [21963557]     Ответить | Цитировать Сообщить модератору
 Re: Firedac master-detail зависшая транзакция  [new]
Мимопроходящий
Member

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

транзакции нужно коммитить и откатывать тогда, когда это нужно.
а не надеяться на "неестественный интеллект" библиотеки доступа.

Posted via ActualForum NNTP Server 1.5

4 сен 19, 15:38    [21963583]     Ответить | Цитировать Сообщить модератору
 Re: Firedac master-detail зависшая транзакция  [new]
jeykey84
Member

Откуда:
Сообщений: 6
Для воспроизведения необходимо в дизайн тайме установить свойство Active в True у ClientDataSet1
4 сен 19, 16:01    [21963619]     Ответить | Цитировать Сообщить модератору
 Re: Firedac master-detail зависшая транзакция  [new]
jeykey84
Member

Откуда:
Сообщений: 6
Если в таблице master нет данных, то при открытии detail не выполняется процедура TFDCustomCommand.Fetch юнита FireDAC.Comp.Client, а в ней полю FOperationFinished должно присваиваться событие FetchFinished, которое закрывает транзакцию.
В итоге остается открытая транзакция.
4 сен 19, 20:34    [21963920]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить