powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FireDac Transaction
20 сообщений из 20, страница 1 из 1
FireDac Transaction
    #39869605
alexK19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, до сегодня учился писать на Delphi7. пользовался стандартными IB компонентами.
Вопрос в следующем: Перед селективным запросом, я всегда закрывал IBTransaction привязанную к IBQuery через который делал запрос, для того чтобы я видел все изменения в БД, так-как не сбросив IBTransaction, я их не увижу.
В коде это примерно так:

Код: pascal
1.
2.
3.
4.
IBTransaction.Active := False;
IBQuery.Active := False;
IBQuery.SQL.Text := 'select............';
IBQuery.Open;




Опробовал сегодня бесплатную Delphi 10.3, пробовал FireDac компоненты, но там FDTransaction.Active - read only свойство.
Подскажите, как правильно сбросить транзакцию через эти компоненты?
...
Рейтинг: 0 / 0
FireDac Transaction
    #39869606
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexK19,

StartTransaction, Commit, Rollback.
Active - не надо пользоваться ни где, не только в FireDac
...
Рейтинг: 0 / 0
FireDac Transaction
    #39869611
alexK19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисalexK19,

StartTransaction, Commit, Rollback.
Active - не надо пользоваться ни где, не только в FireDac

Т.е перед выборкой я ее просто перестартовую и все, даже если она активна вызывая метод StartTransaction?

использование Active - это просто признак дурного тона? или есть последствия?
...
Рейтинг: 0 / 0
FireDac Transaction
    #39869613
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexK19Перед селективным запросом, я всегда закрывал IBTransaction привязанную к IBQuery через который делал запрос, для того чтобы я видел все изменения в БД, так-как не сбросив IBTransaction, я их не увижу.
Трешняк какой-то.
...
Рейтинг: 0 / 0
FireDac Transaction
    #39869615
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexK19использование Active - это просто признак дурного тона?

да. Потому что IBTransaction.Active := False; - это хз что, то ли commit, то ли rollback
...
Рейтинг: 0 / 0
FireDac Transaction
    #39869617
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexK19,

если тебе нужно видеть изменения, ты должен либо смотреть на эти изменения в контексте той же транзакции, где эти изменения делались. Либо транзакция, в которой делались изменения, должна быть подтверждена, а транзакция, в которой ты читаешь:
- должна стартовать после подтверждения первой транзакции
- или иметь право читать изменения, сделанные других подтвержденных транзакциях.

А как ты это сделаешь - дело десятое.
...
Рейтинг: 0 / 0
FireDac Transaction
    #39869621
alexK19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёёalexK19,

если тебе нужно видеть изменения, ты должен либо смотреть на эти изменения в контексте той же транзакции, где эти изменения делались. Либо транзакция, в которой делались изменения, должна быть подтверждена, а транзакция, в которой ты читаешь:
- должна стартовать после подтверждения первой транзакции
- или иметь право читать изменения, сделанные других подтвержденных транзакциях.

А как ты это сделаешь - дело десятое.

Ну по сути я так и делаю:

вот у меня есть
Transaction1 <-> Query1
Transaction2 <-> Query2

после Transaction1.Commit, я должен перестартовать Transaction2, чтобы увидеть все изменения.

Другое дело, что Transaction2 должна быть уже всегда закрыта, при изменениях через другие транзакции.
Получается, что даже после селективного запроса я должен вызывать Commit, чтобы транзакция закрылась, правильно?
...
Рейтинг: 0 / 0
FireDac Transaction
    #39869622
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexK19я должен перестартовать Transaction2, чтобы увидеть все изменения.
ну так не используй snapshot транзакции, используй read committed !

http://www.ibase.ru/ibx/#ibtransaction
...
Рейтинг: 0 / 0
FireDac Transaction
    #39869634
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexK19что даже после селективного запроса я должен вызывать Commit, чтобы транзакция закрылась,
правильно?

Неправильно. Переосмысли архитектуру. Транзакции должны стартовать когда это требуется и
завершаться так быстро как только это возможно. Если у тебя "после коммита одной
транзакции надо рестартовать другую", то что-то смердит в консерватории.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac Transaction
    #39870385
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я для чтения использую одну читающую транзакцию, которая создается при старте приложения
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 Result := TFDTransaction.Create(AOwner);
    try
      Result.Connection:=FDB;
      Result.Options.AutoCommit:=False;
      Result.Options.AutoStart:=False;
      Result.Options.AutoStop:=False;
      Result.Options.DisconnectAction:=xdCommit;
      Result.Options.EnableNested:=False;
      Result.Options.Isolation:=xiReadCommitted;
      Result.Options.ReadOnly:=True;
      Result.Options.Params.Add('read read_commited rec_version');
      Result.Options.StopOptions:=[xoIfCmdsInactive,xoIfAutoStarted];
......


и исполую ее когда мне надо сделать всякие select.............
...
Рейтинг: 0 / 0
FireDac Transaction
    #39870399
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua,

сие (долгоживущая "читающая" транзакция) работает, но более не рекомендовано, ибо несёт в себе некоторый негатив.
Рекомендуется заливать набор данных в клиентский датасет, подтверждая транзакцию (Commit).
...
Рейтинг: 0 / 0
FireDac Transaction
    #39870403
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёибо несёт в себе некоторый негатив.
какой?
...
Рейтинг: 0 / 0
FireDac Transaction
    #39870406
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
02.10.2019 11:02, ёёёёё пишет:
> сие (долгоживущая "читающая" транзакция) работает, но более не
> рекомендовано,


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac Transaction
    #39870416
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

ага. Я напомню:
Если раньше транзакция RO RC сразу стартовала как пре-коммиттед, то в ФБ 4 такого нет, это обычная транзакция.
НО. В ФБ 4 в конфиге есть переключатель по этому поводу. Кроме того, мусор в ФБ 4 собирается не так, как раньше, что позволяет не париться сильно по поводу RO RC.

По поводу "негатива" - это видимо про использование LIST и типа того.
...
Рейтинг: 0 / 0
FireDac Transaction
    #39870433
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага. :)
...
Рейтинг: 0 / 0
FireDac Transaction
    #39870442
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

ну там не только в LIST дело.

Если чтение BLOB отложено, то к моменту когда BLOB реально может быть прочитан по его идентификатору, сам идентификатор уже может протухнуть. С промежуточной сборкой мусора этот сценарий довольно вероятен. Поэтому есть два решения, либо читать содержимое BLOB сразу по мере фетча и кешировать в датасетах (что не очень экономно), либо не выбирать BLOB вовсе в этом DataSet, а дёргать его отдельным запросом по ключу таблицы, когда он потребуется.

А про LIST раз уж он используется, то скорее всего для отчётной формы, а раз так, то там с большой вероятностью курсор должен быть вычитан полностью вместе со всеми BLOB
...
Рейтинг: 0 / 0
FireDac Transaction
    #39872124
alexK19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поди тут разберись как правильно делать, наверное только с опытом прийдет.
В одной из прочтенных статей настоятельно рекомендуется отключать свойства AutoStart и AutoStop для полного ручного управления транзакцией, но если я буду что-то читать через эту транзакцию, то мне прийдется стартовать ее вручную (StartTransaction).
Использовать для чтения отдельные транзакции - плодить компоненты. Использовать одну читающую - не всегда вариант, так иногда хочется чтобы на разных вкладках в DBGridax сохранялся результат.
...
Рейтинг: 0 / 0
FireDac Transaction
    #39872128
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexK19Использовать для чтения отдельные транзакции - плодить компоненты.

А их разработчики с тебя деньги берут за каждый экземпляр?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDac Transaction
    #39872130
alexK19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё!!! Спасибо уважаемы, что что-то подсказали и не загнобили новичка.
Получается в общем случае в приложении достаточно двух транзакций, как я понял:
1) Первая для insert\update\delete (на нее вешаем все хранимые процедуры, каждая процедура модифицирует определенную таблицу)
2) Вторая для select (вешаем на нее все Query <- DataSource <- DBGrid) для каждой таблички отдельный Query.

PS. В первоначальном варианте, на старте обучения наплодил отдельных транзакций на каждую таблицу.
Но оно наверное и хорошо, что пришлось пообжигаться на собственном опыте. А все началось с того, что не знал что транзакции бывают "разные" (readcommited , shaphot,....).
Но трошки вроде въехал, нужно учиться дальше
...
Рейтинг: 0 / 0
FireDac Transaction
    #39872131
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexK19Поди тут разберись как правильно делать, наверное только с опытом прийдет.
В одной из прочтенных статей настоятельно рекомендуется отключать свойства AutoStart и AutoStop для полного ручного управления транзакцией...

В опции "AllowAutoStart" ничего страшного нет. В ея нутрях сделано так, что если ты стартовал трансакцию ручками, то потом, когда придет время "Автостопа" - сие учтется: "ага, он тут рукосуйством занимается, ну и мне значит не след завершаться". Удобно: меньше движений при коротких операциях, и в то же время не мешает ручному управлению, если захочется.

alexK19...
Использовать для чтения отдельные транзакции - плодить компоненты. Использовать одну читающую - не всегда вариант, так иногда хочется чтобы на разных вкладках в DBGridax сохранялся результат.
Обычно ты уже представляешь, что тебе нужно при работе. Например, настроек трансакций нужно совсем немного, часто всего две-три: 1)RC+RW, 2) RC+RO и, возможно, 3) снапшот-трансакцию.
Поэтому часто удобно создать собственный компонент, инкапсулирующий нужные именно тебе настройки. Например, пусть будет фабрика классов, генерирующая настроенные объекты - "запросы", уже подключенные к объекту коннекта и к настроенной (возможно - созданной тут же) трансакции. В итоге - меньше тупой однообразной работы, и централизованное управление.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FireDac Transaction
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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