PG. UniDac 6.1.3. TUniQuery. Транзакции

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Закрыто
raMZES
Сообщения: 30
Зарегистрирован: Ср 14 сен 2011 10:49

PG. UniDac 6.1.3. TUniQuery. Транзакции

Сообщение raMZES » Ср 13 май 2015 16:35

Добрый день.

Возможно я делаю что-то не так, поскольку UniDac только начинаю осваивать. Тестирую на СУБД PostgreSQL 9.4.1

Есть:
TUniConnection
TPostgreSQLUniProvider
TUniTransaction
TUniQuery
TUniDataSources
и т.д.

К TUniQuery подцеплен TUniTransaction. Он же подцеплен и к TUniConnection. В TUniQuery написаны INSERT, UPDATE, DELETE запросы.

При добавлении\редактировании\удалении данных в DBGrid не видно, чтобы TUniQuery как-то использовал подцепленную к нему TUniTransaction.

Не важно, указал ли я то, что TUniTransaction должна быть ReadOnly, данные все равно изменяются\удаляются.

В другом приложении (тестовом, параллельно запущенном) для TUniTransaction указываю уровень изоляции ilRepeatableRead, но при повторном запросе, без завершения и старта транзакции, dвидны добавленные\измененные данные из первого приложения.

Подскажите пожалуйста, как правильно работать с транзакциями при помощи UniDac с Pg.

Спасибо.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: PG. UniDac 6.1.3. TUniQuery. Транзакции

Сообщение AndreyZ » Чт 14 май 2015 13:46

Для того чтобы начать транзакцию, вызовите метод TUniTransaction.StartTransaction . Тогда для случая
raMZES писал(а):Не важно, указал ли я то, что TUniTransaction должна быть ReadOnly, данные все равно изменяются\удаляются.
вы получите сообщение об ошибке 'в транзакции в режиме "только чтение" нельзя выполнить UPDATE.'.

А для случая
raMZES писал(а):В другом приложении (тестовом, параллельно запущенном) для TUniTransaction указываю уровень изоляции ilRepeatableRead, но при повторном запросе, без завершения и старта транзакции, dвидны добавленные\измененные данные из первого приложения.
изменения, которые вы внесли в приложении 1, не будут видны в приложении 2 до тех пор, пока вы не вызовите в приложении 1 метод TUniTransaction.Commit .

raMZES
Сообщения: 30
Зарегистрирован: Ср 14 сен 2011 10:49

Re: PG. UniDac 6.1.3. TUniQuery. Транзакции

Сообщение raMZES » Чт 14 май 2015 20:10

AndreyZ писал(а):Для того чтобы начать транзакцию, вызовите метод TUniTransaction.StartTransaction.
Это понятно. В контексте какой транзакции работает TUniQuery? Я явно указал использовать определенную TUniTransaction, но это свойство игнорируется.
AndreyZ писал(а): изменения, которые вы внесли в приложении 1, не будут видны в приложении 2 до тех пор, пока вы не вызовите в приложении 1 метод TUniTransaction.Commit .
В том то и дело, что во втором приложении, в котором указан уровень изоляции RepeatableRead, закоммиченные данные других транзакций не должны быть видны, пока я не завершил и заново не запустил эту транзакцию.

Это из документации PG.

Код: Выделить всё

13.2.2. Repeatable Read Isolation Level

The Repeatable Read isolation level only sees data committed before the transaction began; it never sees either uncommitted data or changes committed during transaction execution by concurrent transactions.

Здесь же получается, что я указал в TUniTransaction уровень изоляции RepeatableRead, а он работает как ReadCommited.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: PG. UniDac 6.1.3. TUniQuery. Транзакции

Сообщение AndreyZ » Пт 15 май 2015 08:10

raMZES писал(а):Я явно указал использовать определенную TUniTransaction, но это свойство игнорируется.
Пожалуйста уточните, после того как вы для этой транзакции установили сво-во ReadOnly в True, вызвали метод StartTransaction и изменяете данные в датасете - вы получаете сообщение об ошибке 'в транзакции в режиме "только чтение" нельзя выполнить UPDATE.'?
raMZES писал(а):Здесь же получается, что я указал в TUniTransaction уровень изоляции RepeatableRead, а он работает как ReadCommited.
Для этого вам необходимо для транзакции, которая связана с датасетом TUniQuery, вызывать метод StartTransaction перед открытием этого датасета.

raMZES
Сообщения: 30
Зарегистрирован: Ср 14 сен 2011 10:49

Re: PG. UniDac 6.1.3. TUniQuery. Транзакции

Сообщение raMZES » Пт 15 май 2015 11:13

Спасибо за ответ.
AndreyZ писал(а): Пожалуйста уточните, после того как вы для этой транзакции установили сво-во ReadOnly в True, вызвали метод StartTransaction и изменяете данные в датасете - вы получаете сообщение об ошибке 'в транзакции в режиме "только чтение" нельзя выполнить UPDATE.'?
Я метод StartTransaction не вызываю. Пожалуйста подскажите, для чего?
TUniTransaction с включенным ReadOnly. Открываю TUniQuery. В в DBGrid пробую изменить данные. Данные меняются. Почему, если TUniTransaction, в контексте которой работает открытый TUniQuery, запущена с включенным ReadOnly?
AndreyZ писал(а): Для этого вам необходимо для транзакции, которая связана с датасетом TUniQuery, вызывать метод StartTransaction перед открытием этого датасета.
Для чего это делать, если я открыл TUniQuery в TUniTransaction с ilRepeatableRead?
Запустилась транзакция с нужным мне уровнем изоляции. Я смотрю данные. С этим уровнем, сколько бы запросов я не делал, все-равно должны быть одни и те же данные, пока я не завершил и не запустил эту транзакцию.

TUniQuery не может ведь читать данные просто так. Она же работает в контексте транзакции.
В контексте какой транзакции запускается TUniQuery (которому указано использовать TUniTransaction с ilRepeatableRead), когда я его открываю?


Спасибо.

raMZES
Сообщения: 30
Зарегистрирован: Ср 14 сен 2011 10:49

Re: PG. UniDac 6.1.3. TUniQuery. Транзакции

Сообщение raMZES » Пт 15 май 2015 16:28

Разобрался.

В PG если не указать BEGIN, то каждый отдельный оператор имеет неявную команду BEGIN перед оператором и, при успешной отработке оператора, команду COMMIT после оператора, а уровень изоляции и параметр read_only для "дефолтной" транзакции настраивается в файле конфигурации postgresql.conf

Прошу прощения за отнятое время.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: PG. UniDac 6.1.3. TUniQuery. Транзакции

Сообщение AndreyZ » Пн 18 май 2015 12:03

Приятно видеть, что вы разобрались с поведением транзакций в PostgreSQL. Если у вас возникнут вопросы относительно UniDAC, пожалуйста задавайте их и мы на них ответим.

Закрыто