Страница 1 из 1

Транзакция закрывает Select'ы

Добавлено: 08 сен 2006, 15:19
andycat
Приветствую ВСЕХ!

Просьба разьяснить работу/настройку транзакций.

Есть MDI приложение, например в одном окне открыто select'ом (TQuery) одна таблица, в другом что то другое тоже select'ом логически не связанная с первой таблицой. Если я делаю изменение SQL запросом например в первой, то ВСЕ select'ы закрываются.

Почитав (старался внимательно ) :) http://www.ibase.ru/devinfo/ibtrans.htm, наткнулся на такую цитату:

Например SELECT в режиме read committed видит только те записи, которые были committed другими транзакциями или изменены текущей на момент своего старта (т.е. execute). Последующие операции выборки записей (fetch) не будут видеть новые committed записи. Для того, чтобы их увидеть, нужно перевыполнить запрос.

подскажете, плиз как это обойти? т.е. что бы в отображаемой не связанной с изменяемой таблице select не закрывался?

Добавлено: 08 сен 2006, 15:34
Dimitry Sibiryakov
1) Не использовать BDE.
2) Открывать их в разных транзакциях.

Добавлено: 08 сен 2006, 15:40
andycat
1. Используется IBX
2. Создавать несколько компонентов TIBTransaction? Тогда как их привязать к одной TIBDatabase?

Добавлено: 08 сен 2006, 15:48
Merlin
andycat писал(а):1. Используется IBX
И в ём есть TQuery? ;)
andycat писал(а): 2. Создавать несколько компонентов TIBTransaction? Тогда как их привязать к одной TIBDatabase?
А на проперти TIBTransaction хотя бы в OI посмотреть не пробовал? Для развлечения на перекуре например.

Добавлено: 08 сен 2006, 15:50
andycat
1. конечно TIBQuery - просто писать было короче :)

2. изв., не понимаю (некогда не использовал несколько транзакций - не требовалось по логике программ): т.е. я для каждой нужной Select выбираю нужный DefaultTransaction, ставлю им нужные параметры транзакцию и выполняю Open/Execute?

Добавлено: 08 сен 2006, 16:18
CyberMax
andycat писал(а):1. конечно TIBQuery - просто писать было короче :)
Товарищ программист, вы понимаете, что сменили КЛАСС объекта из-за двух букв?.. Давай тогда вместо "Москвич 412" писать "Москвич 4" или "М 412". А то и вовсе "M2". Короче же...
andycat писал(а):2. изв., не понимаю (некогда не использовал несколько транзакций - не требовалось по логике программ): т.е. я для каждой нужной Select выбираю нужный DefaultTransaction, ставлю им нужные параметры транзакцию и выполняю Open/Execute?
Создаешь компонент taReadOnly (TIBTransaction) - транзакцию с ReadOnly-параметрами. При коннекте к БД стартуешь ее, а при дисконнекте коммитишь. Это транзакцию линкуешь ко всем наборам, которые просто считывают данные (не изменяют их). Затем в процессе работы просто рефрешишь определенные записи. Но не забывай, что вставленные записи ты не увидишь. Для этого надо переоткрыть весь набор.
Для той формы, где изменяются данные, создаешь отдельный компонент транзакции - taWrite. Ее линкуешь к TIBQuery этой формы. Ну и при для сохранения изменений вызываешь taWrite.Commit.

Добавлено: 08 сен 2006, 16:27
andycat
понял, спасибо.
[Модератор: удалено полное цитирование поста CyberMax]

Добавлено: 08 сен 2006, 20:38
kdv

Добавлено: 13 сен 2006, 13:37
andycat
Спасибо. Все заработало.