wwswowsogon писал(а): SQLTransaction1.Active := false;
SQLTransaction1.Active := true;
SQLTransaction - можно автоматически настроить путем галок. Когда ему начинать работать и когда завершать, в каком виде Commit/Rollback. И работает до SQLTransaction.Active:=false или уничтожении самого компонента SQLTransaction, завершается согласно установленному состоянию.
SQLTransaction.Active:=true => это есть SQLTransaction.StartTransaction; - при AutoOpen
SQLTransaction.Active:=false => SQLTransaction.Commit или SQLTransaction.Rollback - при AutoClose
а можно в ручную, советую
SQLTransaction.StartTransaction;
SQLQuery.Open
SQLQuery.Post;
SQLQuery.Close;
SQLQuery.ExecSQL;
...
...
...
SQLQuery.Open
SQLQuery.Post;
SQLQuery.Close;
SQLQuery.ExecSQL;
SQLTransaction.Commit; - все изменения подтверждаем; данные становятся видимые для всех.
SQLTransaction.Rollback; - все изменения отменяем; данные которая изменила состояние базы данных в этой транзакции откатываются до состояния SQLTransaction.StartTransaction;
попробуйте разместить две SQLTransaction1; SQLTransaction2; и соответственно SQLQuery1, SQLQuery2 подключите SQLTransaction1; SQLTransaction2.
и попробуйте посмотреть что будет происходить с базой данных для каждой SQLQuery1, SQLQuery2
Добавлено спустя 42 минуты 7 секунд:wwswowsogon писал(а): правильно понимаю, что эти механизмы реализуются больше через SQL-запросы, чем через методы и свойства объектов стандартных компонентов?
А стандартные компоненты ничего не меняют при работе с базой данных. Они ведут себя как на автопилоте, если заложено в них открыть и не беспокоить программиста глубиным изучением правил работы с базой данных, то компоненты сами открывают транзакцию при первом обращении, и закрывают только после уничтожение компонента, или даже закрытия подключения к базы данных(в SQLConnection.transaction как бы намекает на это поведение), удобно при монопольной работе с базой данных.
Или же любое обращение порождает новую транзакцию. Этот режим позволяет увидить сразу все внесенные изменения. Но с ним невозможно работать в рамках комплексных работ:
необходимо внести 1000000 изменений за раз, нужно открыть и зафиксировать транзакцией 1000000 раз, что для базы данных это требует дополнительной нагрузки. Например в 1Ске, без явного указания запуска транзакций изменений и коммита - скорость работы в сотни раз уменьшается при массовых изменений, то что вы сможете за 1 минуту сделать - будете делать 2 часа.
синхронное работу связанных таблиц - необходимо комплексное изменение в разных таблицах разом. Без четкого применения транзакции, другие клиенты смогут увидеть одни данные раньше чем другие обновятся.
ну как пример - клиент меняет данные документа (контрагента, вносит шапку документа, заполняет реквизиты, добавляет позиции товар..) и клиент решает что не станет вносить изменения, жмет кнопку отменить. Транзакция делает Rollback - это достаточно отменить все изменения в рамках этой транзакции. Либо надо откатывается путем Delete.. этим очень сложно провести базу данных в то состояние до начало вбивая отмененного документа.
Если клиент отвалился - то база данных сама закроет все вносимые им изменения(они не подтверждены им).
При тонкой работе с StartTransaction/Commit/Rollback можно сделать комфортной работу для клиента, самим не придумывать "костыли" как вернуть первичное состояние, разрулить одновременную работу между многими клиентами.
С автопилотом, которые встроили разработчики компонента - он подходить скорее для монопольного режима.