Добрый день.
Возможно я делаю что-то не так, поскольку 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.
Спасибо.
PG. UniDac 6.1.3. TUniQuery. Транзакции
Re: PG. UniDac 6.1.3. TUniQuery. Транзакции
Для того чтобы начать транзакцию, вызовите метод TUniTransaction.StartTransaction . Тогда для случая
А для случая
вы получите сообщение об ошибке 'в транзакции в режиме "только чтение" нельзя выполнить UPDATE.'.raMZES писал(а):Не важно, указал ли я то, что TUniTransaction должна быть ReadOnly, данные все равно изменяются\удаляются.
А для случая
изменения, которые вы внесли в приложении 1, не будут видны в приложении 2 до тех пор, пока вы не вызовите в приложении 1 метод TUniTransaction.Commit .raMZES писал(а):В другом приложении (тестовом, параллельно запущенном) для TUniTransaction указываю уровень изоляции ilRepeatableRead, но при повторном запросе, без завершения и старта транзакции, dвидны добавленные\измененные данные из первого приложения.
Re: PG. UniDac 6.1.3. TUniQuery. Транзакции
Это понятно. В контексте какой транзакции работает TUniQuery? Я явно указал использовать определенную TUniTransaction, но это свойство игнорируется.AndreyZ писал(а):Для того чтобы начать транзакцию, вызовите метод TUniTransaction.StartTransaction.
В том то и дело, что во втором приложении, в котором указан уровень изоляции RepeatableRead, закоммиченные данные других транзакций не должны быть видны, пока я не завершил и заново не запустил эту транзакцию.AndreyZ писал(а): изменения, которые вы внесли в приложении 1, не будут видны в приложении 2 до тех пор, пока вы не вызовите в приложении 1 метод TUniTransaction.Commit .
Это из документации 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.
Re: PG. UniDac 6.1.3. TUniQuery. Транзакции
Пожалуйста уточните, после того как вы для этой транзакции установили сво-во ReadOnly в True, вызвали метод StartTransaction и изменяете данные в датасете - вы получаете сообщение об ошибке 'в транзакции в режиме "только чтение" нельзя выполнить UPDATE.'?raMZES писал(а):Я явно указал использовать определенную TUniTransaction, но это свойство игнорируется.
Для этого вам необходимо для транзакции, которая связана с датасетом TUniQuery, вызывать метод StartTransaction перед открытием этого датасета.raMZES писал(а):Здесь же получается, что я указал в TUniTransaction уровень изоляции RepeatableRead, а он работает как ReadCommited.
Re: PG. UniDac 6.1.3. TUniQuery. Транзакции
Спасибо за ответ.
TUniTransaction с включенным ReadOnly. Открываю TUniQuery. В в DBGrid пробую изменить данные. Данные меняются. Почему, если TUniTransaction, в контексте которой работает открытый TUniQuery, запущена с включенным ReadOnly?
Запустилась транзакция с нужным мне уровнем изоляции. Я смотрю данные. С этим уровнем, сколько бы запросов я не делал, все-равно должны быть одни и те же данные, пока я не завершил и не запустил эту транзакцию.
TUniQuery не может ведь читать данные просто так. Она же работает в контексте транзакции.
В контексте какой транзакции запускается TUniQuery (которому указано использовать TUniTransaction с ilRepeatableRead), когда я его открываю?
Спасибо.
Я метод StartTransaction не вызываю. Пожалуйста подскажите, для чего?AndreyZ писал(а): Пожалуйста уточните, после того как вы для этой транзакции установили сво-во ReadOnly в True, вызвали метод StartTransaction и изменяете данные в датасете - вы получаете сообщение об ошибке 'в транзакции в режиме "только чтение" нельзя выполнить UPDATE.'?
TUniTransaction с включенным ReadOnly. Открываю TUniQuery. В в DBGrid пробую изменить данные. Данные меняются. Почему, если TUniTransaction, в контексте которой работает открытый TUniQuery, запущена с включенным ReadOnly?
Для чего это делать, если я открыл TUniQuery в TUniTransaction с ilRepeatableRead?AndreyZ писал(а): Для этого вам необходимо для транзакции, которая связана с датасетом TUniQuery, вызывать метод StartTransaction перед открытием этого датасета.
Запустилась транзакция с нужным мне уровнем изоляции. Я смотрю данные. С этим уровнем, сколько бы запросов я не делал, все-равно должны быть одни и те же данные, пока я не завершил и не запустил эту транзакцию.
TUniQuery не может ведь читать данные просто так. Она же работает в контексте транзакции.
В контексте какой транзакции запускается TUniQuery (которому указано использовать TUniTransaction с ilRepeatableRead), когда я его открываю?
Спасибо.
Re: PG. UniDac 6.1.3. TUniQuery. Транзакции
Разобрался.
В PG если не указать BEGIN, то каждый отдельный оператор имеет неявную команду BEGIN перед оператором и, при успешной отработке оператора, команду COMMIT после оператора, а уровень изоляции и параметр read_only для "дефолтной" транзакции настраивается в файле конфигурации postgresql.conf
Прошу прощения за отнятое время.
В PG если не указать BEGIN, то каждый отдельный оператор имеет неявную команду BEGIN перед оператором и, при успешной отработке оператора, команду COMMIT после оператора, а уровень изоляции и параметр read_only для "дефолтной" транзакции настраивается в файле конфигурации postgresql.conf
Прошу прощения за отнятое время.
Re: PG. UniDac 6.1.3. TUniQuery. Транзакции
Приятно видеть, что вы разобрались с поведением транзакций в PostgreSQL. Если у вас возникнут вопросы относительно UniDAC, пожалуйста задавайте их и мы на них ответим.