Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FireDac Transaction / 20 сообщений из 20, страница 1 из 1
30.09.2019, 22:41
    #39869605
alexK19
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDac Transaction
Здравствуйте, до сегодня учился писать на 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
30.09.2019, 22:44
    #39869606
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDac Transaction
alexK19,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Неправильно. Переосмысли архитектуру. Транзакции должны стартовать когда это требуется и
завершаться так быстро как только это возможно. Если у тебя "после коммита одной
транзакции надо рестартовать другую", то что-то смердит в консерватории.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.10.2019, 10:24
    #39870385
Sashaua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDac Transaction
Я для чтения использую одну читающую транзакцию, которая создается при старте приложения
Код: 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
02.10.2019, 11:02
    #39870399
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDac Transaction
Sashaua,

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


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

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

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

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

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

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

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

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

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

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


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