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

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
andycat
Сообщения: 65
Зарегистрирован: 22 фев 2005, 12:06

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

Сообщение andycat » 08 сен 2006, 15:19

Приветствую ВСЕХ!

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

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

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

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

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 08 сен 2006, 15:34

1) Не использовать BDE.
2) Открывать их в разных транзакциях.

andycat
Сообщения: 65
Зарегистрирован: 22 фев 2005, 12:06

Сообщение andycat » 08 сен 2006, 15:40

1. Используется IBX
2. Создавать несколько компонентов TIBTransaction? Тогда как их привязать к одной TIBDatabase?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 08 сен 2006, 15:48

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

andycat
Сообщения: 65
Зарегистрирован: 22 фев 2005, 12:06

Сообщение andycat » 08 сен 2006, 15:50

1. конечно TIBQuery - просто писать было короче :)

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

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 08 сен 2006, 16:18

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

andycat
Сообщения: 65
Зарегистрирован: 22 фев 2005, 12:06

Сообщение andycat » 08 сен 2006, 16:27

понял, спасибо.
[Модератор: удалено полное цитирование поста CyberMax]

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 08 сен 2006, 20:38


andycat
Сообщения: 65
Зарегистрирован: 22 фев 2005, 12:06

Сообщение andycat » 13 сен 2006, 13:37

Спасибо. Все заработало.

Ответить