Как организовать работу двух транзакций?

AN\ndrey
Дата: 13.10.2006 23:23:44
Проблема такая при вставке и Commit'е транзакции теряется Набор данных с базой, то есть все пропадает(св-во у IBQUery становится в False). Приходится поновой активировать IBQuery. Подскажите как связать IBQuery с двумя транзакциями, одной на чтение, другой на изменение данных. Просьба статьи на Ibase.ru не предлагать, читал там все.
Obrazer
Дата: 13.10.2006 23:45:28
AN\ndrey
Просьба статьи на Ibase.ru не предлагать, читал там все.

Плохо читал

Смысл в том, что коммит завершает все действия с БД, соответс венно запрос открытым держать не имеет смысла
А если надо оставлять его открытым, то надо открывать его в своей транзакции
Гаджимурадов Рустам
Дата: 14.10.2006 00:39:45

ANndrey> Проблема такая при вставке и Commit'е транзакции теряется Набор данных с базой,
Конкретнее, при какой вставке и каком Commit'е?
И желательно с описанием что делается в коде и чего хочется получить.

ANndrey> Приходится поновой активировать IBQuery.
Зачем?

ANndrey> Подскажите как связать IBQuery с двумя транзакциями,
ANndrey> одной на чтение, другой на изменение данных.
Легко - никак. Либо переходить на FIBPlus, либо воспользоваться соотв. руководством (и готовым
компонентом) на ibase.ru, либо идти своим третьим (и в общем-то тернистым) путем.

ANndrey> Просьба статьи на Ibase.ru не предлагать, читал там все.
Плохо читал. Или не то. Или не все. Там есть статья (и готовый компонент)
именно на эту тему - с возможностью работы с раздельными транзакциями.

Posted via ActualForum NNTP Server 1.3

kdv
Дата: 14.10.2006 01:00:34
еще раз перечитай
www.ibase.ru/devinfo/ibx.htm
как показывает практика, если "статьи с ibase.ru" не предлагать, значит читал по диагонали.
AN\ndrey
Дата: 14.10.2006 10:18:17
Набор данных пропадает если я пишу так:

a:= ''''+form6.edit1.Text+'''';
datamodule2.IBQuerycity.SQL.Clear;
datamodule2.IBQuerycity.SQL.Add('insert into city(city) values('+a+')');
datamodule2.IBQuerycity.Open ;
Datamodule2.ibTrancaction1.commit;

А если пишу вместо ibTrancaction1.commitRetaining то Набор данных сохраняется, но второй пользователь не видит внесенной записи, которую внес первый. Видно только при ibTrancaction1.commit.
fedwarov
Дата: 14.10.2006 10:36:25
Вообщем-то все тебе правильно объяснили. Только коротко, поэтому нужно уметь читать ответы. Теперь пространно:
1. Да, при чистом не-retaining Commit или Rollback запросы связанные с транзакцией закрываются однозначно.
2. Не рекомендуется использовать Retaining, почему - есть статья на ibase, коротко и упрощенно - это не совсем полный Commit в смысле изменения идентификаторов транзакций, что может приводить к накоплении версионного мусора и потенциально к снижению производительности, вообщем - низкий класс, грязная работа :-). Если хочется не переоткрывать запросы, нужно две транзакции.
3. В исходном виде IBQuery не поддерживает работу с двумя транзакциями. Если это нужно то есть три варианта: переход с IBX на FIBPlus; патч IBX (об этом должно быть на ibase.ru); использование для вставки, обновления и удаления отдельных IBSQL с [только] пишушей транзакцией, а в IBQuery использовать фиктивные ничего не делающие запросы типа delete from special_table where 0 = 1 (для работы методов Insert и Delete) в сочетании с транзакцией только на чтение.
4. Почему второй пользователь не видит записи при CommitRetaining - не знаю. Для начала убедись, что у него читающая транзакция с параметром read_commited (если не известно, что это - смотри статью на ibase, если коротко - то это возможность читать закоммиченые данные только переоткрывая запрос без перестарта транзакции). А потом - все таки смотри п.2