Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 FireDac Transaction  [new]
alexK19
Member

Откуда:
Сообщений: 21
Здравствуйте, до сегодня учился писать на Delphi7. пользовался стандартными IB компонентами.
Вопрос в следующем: Перед селективным запросом, я всегда закрывал IBTransaction привязанную к IBQuery через который делал запрос, для того чтобы я видел все изменения в БД, так-как не сбросив IBTransaction, я их не увижу.
В коде это примерно так:

IBTransaction.Active := False;
IBQuery.Active := False;
IBQuery.SQL.Text := 'select............';
IBQuery.Open;



Опробовал сегодня бесплатную Delphi 10.3, пробовал FireDac компоненты, но там FDTransaction.Active - read only свойство.
Подскажите, как правильно сбросить транзакцию через эти компоненты?
30 сен 19, 22:41    [21983331]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10154
alexK19,

StartTransaction, Commit, Rollback.
Active - не надо пользоваться ни где, не только в FireDac
30 сен 19, 22:44    [21983332]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
alexK19
Member

Откуда:
Сообщений: 21
Симонов Денис
alexK19,

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


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

использование Active - это просто признак дурного тона? или есть последствия?
30 сен 19, 22:59    [21983339]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
alexK19
Перед селективным запросом, я всегда закрывал IBTransaction привязанную к IBQuery через который делал запрос, для того чтобы я видел все изменения в БД, так-как не сбросив IBTransaction, я их не увижу.

Трешняк какой-то.
30 сен 19, 23:02    [21983341]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10154
alexK19
использование Active - это просто признак дурного тона?


да. Потому что IBTransaction.Active := False; - это хз что, то ли commit, то ли rollback
30 сен 19, 23:07    [21983344]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
alexK19,

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

А как ты это сделаешь - дело десятое.
30 сен 19, 23:10    [21983347]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
alexK19
Member

Откуда:
Сообщений: 21
ёёёёё
alexK19,

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

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


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

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

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

Другое дело, что Transaction2 должна быть уже всегда закрыта, при изменениях через другие транзакции.
Получается, что даже после селективного запроса я должен вызывать Commit, чтобы транзакция закрылась, правильно?
30 сен 19, 23:20    [21983352]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28336
alexK19
я должен перестартовать Transaction2, чтобы увидеть все изменения.

ну так не используй snapshot транзакции, используй read committed !

http://www.ibase.ru/ibx/#ibtransaction
30 сен 19, 23:25    [21983353]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

alexK19
что даже после селективного запроса я должен вызывать Commit, чтобы транзакция закрылась,
правильно?

Неправильно. Переосмысли архитектуру. Транзакции должны стартовать когда это требуется и
завершаться так быстро как только это возможно. Если у тебя "после коммита одной
транзакции надо рестартовать другую", то что-то смердит в консерватории.

Posted via ActualForum NNTP Server 1.5

1 окт 19, 00:06    [21983369]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
Sashaua
Member

Откуда: Kiev
Сообщений: 176
Я для чтения использую одну читающую транзакцию, которая создается при старте приложения
 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.............
2 окт 19, 10:24    [21984583]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
Sashaua,

сие (долгоживущая "читающая" транзакция) работает, но более не рекомендовано, ибо несёт в себе некоторый негатив.
Рекомендуется заливать набор данных в клиентский датасет, подтверждая транзакцию (Commit).
2 окт 19, 11:02    [21984629]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28336
ёёёёё
ибо несёт в себе некоторый негатив.

какой?
2 окт 19, 11:18    [21984647]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
Мимопроходящий
Member

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

02.10.2019 11:02, ёёёёё пишет:
> сие (долгоживущая "читающая" транзакция) работает, но более не
> рекомендовано,

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

Posted via ActualForum NNTP Server 1.5

2 окт 19, 11:21    [21984651]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28336
Мимопроходящий,

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

По поводу "негатива" - это видимо про использование LIST и типа того.
2 окт 19, 11:35    [21984668]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
Ага. :)
2 окт 19, 11:57    [21984699]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10154
kdv,

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

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

А про LIST раз уж он используется, то скорее всего для отчётной формы, а раз так, то там с большой вероятностью курсор должен быть вычитан полностью вместе со всеми BLOB
2 окт 19, 12:08    [21984711]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
alexK19
Member

Откуда:
Сообщений: 21
Поди тут разберись как правильно делать, наверное только с опытом прийдет.
В одной из прочтенных статей настоятельно рекомендуется отключать свойства AutoStart и AutoStop для полного ручного управления транзакцией, но если я буду что-то читать через эту транзакцию, то мне прийдется стартовать ее вручную (StartTransaction).
Использовать для чтения отдельные транзакции - плодить компоненты. Использовать одну читающую - не всегда вариант, так иногда хочется чтобы на разных вкладках в DBGridax сохранялся результат.
5 окт 19, 23:55    [21987500]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

alexK19
Использовать для чтения отдельные транзакции - плодить компоненты.

А их разработчики с тебя деньги берут за каждый экземпляр?

Posted via ActualForum NNTP Server 1.5

6 окт 19, 00:20    [21987506]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
alexK19
Member

Откуда:
Сообщений: 21
Всё!!! Спасибо уважаемы, что что-то подсказали и не загнобили новичка.
Получается в общем случае в приложении достаточно двух транзакций, как я понял:
1) Первая для insert\update\delete (на нее вешаем все хранимые процедуры, каждая процедура модифицирует определенную таблицу)
2) Вторая для select (вешаем на нее все Query <- DataSource <- DBGrid) для каждой таблички отдельный Query.

PS. В первоначальном варианте, на старте обучения наплодил отдельных транзакций на каждую таблицу.
Но оно наверное и хорошо, что пришлось пообжигаться на собственном опыте. А все началось с того, что не знал что транзакции бывают "разные" (readcommited , shaphot,....).
Но трошки вроде въехал, нужно учиться дальше
6 окт 19, 01:08    [21987513]     Ответить | Цитировать Сообщить модератору
 Re: FireDac Transaction  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
alexK19
Поди тут разберись как правильно делать, наверное только с опытом прийдет.
В одной из прочтенных статей настоятельно рекомендуется отключать свойства AutoStart и AutoStop для полного ручного управления транзакцией...


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

alexK19
...
Использовать для чтения отдельные транзакции - плодить компоненты. Использовать одну читающую - не всегда вариант, так иногда хочется чтобы на разных вкладках в DBGridax сохранялся результат.

Обычно ты уже представляешь, что тебе нужно при работе. Например, настроек трансакций нужно совсем немного, часто всего две-три: 1)RC+RW, 2) RC+RO и, возможно, 3) снапшот-трансакцию.
Поэтому часто удобно создать собственный компонент, инкапсулирующий нужные именно тебе настройки. Например, пусть будет фабрика классов, генерирующая настроенные объекты - "запросы", уже подключенные к объекту коннекта и к настроенной (возможно - созданной тут же) трансакции. В итоге - меньше тупой однообразной работы, и централизованное управление.
6 окт 19, 01:15    [21987514]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить