Транзакции в MyDac

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Ответить
Goris
Сообщения: 5
Зарегистрирован: Вс 21 янв 2018 22:44

Транзакции в MyDac

Сообщение Goris » Вт 23 янв 2018 05:23

Здравствуйте!
Работаю в Delphi 7, установлен MyDAC 7.1.6.

Есть tDBGridEh, связанный с tDataSource-tMyQuery-tMyConnection
Таблица в БД MySQL типа InnoDB. Свойство MyQuery.FetchAll=true.

При создании формы ставлю MyConnection1.StartTransaction
В DBGridEh редактирую данные, потом жму на соответствующую кнопку для MyConnection1.Commit либо MyConnection1.Rollback.
Выяснилось, что в любом случае происходит запись данных в таблицу, Rollback не срабатывает, ошибок при этом не возникает. Насчет работы Commit ничего не могу сказать, т.к. запись происходит как при его наличии, так и при его отсутствии.
Попытка писать через MyConnection.ExecSQL('set autocommit = 0', []); и MyConnection.ExecSQL('rollback', []); также не работает - нет отмены транзакции.

Перечитал практически весь форум, перепробовал предлагаемые варианты, решения моего вопроса не нашел. Подскажите, как правильно работать с транзакциями, может чего пропустил.

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Транзакции в MyDac

Сообщение ViktorV » Вт 23 янв 2018 13:52

К сожалению, нам не удалось воспроизвести проблему.
Пожалуйста, проверьте и сообщите нам, воспроизводиться ли проблема на нашем MyDacDemo демо проекте, на вкладке 'General Demos\Transactions, который вы можете найти в директории: %MyDACDemos%\MyDacDemo, где %MyDACDemos% это путь, по которому установлены MyDAC Demo проекты на Вашем компьютере.
Обратите внимание, вам следует ваызвать метод Refresh, для получения результата о выполнения методов Rollback или Commit. В нашем примере вы можете это сделать с помощью кнопки Refresh data компонента DBNavigator.

Goris
Сообщения: 5
Зарегистрирован: Вс 21 янв 2018 22:44

Re: Транзакции в MyDac

Сообщение Goris » Ср 24 янв 2018 00:38

С помощью MyDacDemo демо проекта (Transactions) удалось локализовать место сбоя.
После старта транзакции (кнопка Start) меняем в какой нибудь ячейке данные. Если потом на другие строки таблицы не переходим (!), нажимаем последовательно кнопки Rollback и DBNaviganor.Refresh, то метод Rollback не срабатывает.
Для того, чтобы он сработал, после изменения в ячейке надо либо перейти на другую строку таблицы (тогда нажатие на Rollback + DBNaviganor.Refresh сработает), либо нажать следующую комбинацию:
DBNaviganor.Refresh - кнопка Rollback - DBNaviganor.Refresh
В принципе, можно использовать в программе комбинацию tmyquery.Refresh - MyConnection1.Rollback - tmyquery.Refresh, но это, скорее, силовое решение в лоб. Есть ли более изящные методы решения данной проблемы?

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Транзакции в MyDac

Сообщение ViktorV » Ср 24 янв 2018 13:29

Вызов метода Rollback отменяет изменения данных на сервере, которые произошли после вызова метода StartTransaction. Изменения отправляются на сервер после вызова метода Post, когда вы перемещаетесь по записям в DBGrid, метод Post вызывается автоматически. В вашем случае, когда вы редактируете поле, метод Post еще не вызван и вызов метода Rollback не применится к данным этого поля.
Для решения вашей задачи, вы можете вместо комбинации DBNaviganor.Refresh - кнопка Rollback - DBNaviganor.Refresh вызывать правильную комбинацию: MyQuery.Post - кнопка Rollback - DBNaviganor.Refresh. Также, для отмены изменений редактирования поля, вы можете вызывать метод TMyQuery.Cancel.

Goris
Сообщения: 5
Зарегистрирован: Вс 21 янв 2018 22:44

Re: Транзакции в MyDac

Сообщение Goris » Чт 25 янв 2018 19:38

Благодарю!

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Транзакции в MyDac

Сообщение ViktorV » Пн 29 янв 2018 10:38

Спасибо за интерес к нашим продуктам и помощь в их развитии.
Обращайтесь к нам, если у Вас возникнут вопросы по нашим продуктам.

Ответить