Текущий архив: 2003.06.19;
Скачать: CL | DM;
Вниз
Вопрос по транзакции в InterBase Найти похожие ветки
← →
АТ (2003-05-27 04:24) [0]Пользователь заполняет данными несколько форм. После этого он нажимает на кнопку и все изменения сохраняются. Предполагается, что чтобы отобразить все изменения в базе надо выполнить несколько SQL-запросов, а между ними еще и посчитать что-нибудь. Хочу чтобы чтобы все изменения выполнялись в рамках одной транзакции.
Если я последовательно выполню ряд динамических SQL-запросов через компонент IBQuery в свойстве Transaction которого будет указан компонент IBTransaction. То по идее транзакция перед началом первого запроса должна открыться, а закрыться только тогда, когда я ее закрою по Commit, пропустив через себя все мои запросы не закрываясь. Так-ли это? (св-во AutoStopAction компонента IBTransaction установлен в saNone)
← →
Danilka (2003-05-27 07:38) [1]http://www.ibase.ru/devinfo/ibxtrans.htm
Неявные транзакции в IBX
Если явно не вызывать TIBTransaction.StartTransaction, а просто открыть набор данных, подключенный к TIBTransaction, (например TIBTable) начнется неявная, с точки зрения клиентской программы, транзакция. К сожалению, неявную транзакцию можно только подтвердить (COMMIT), и нельзя откатить (ROLLBACK).
А что мешает самому управлять транзакцией?
← →
Жук (2003-05-27 08:53) [2]
> Danilka © (27.05.03 07:38)
А я и не знал ! Может по этому откатывалось всё без проблем ?
← →
xmrz (2003-05-27 08:59) [3]По моему оставлять набор данных открытым во время заполнения форм - расточительно. Я обычно записываю промежуточные результате в собственной структуре данных, делаю любые промежуточные расчёты, а потом вставка (редактирование) данных через хранимую процедуру, после этого сразу commit. А если пользователь нажал отменить, то хранимая процедура не выполняется, а структура с данными - освобождается.
← →
Danilka (2003-05-27 09:05) [4]Жук © (27.05.03 08:53)
а может потому что у тебя не IBX, а что-то другое?
;))
посмотри исходники IBX.
сейчас только что проверил, на форму повесил IBTable, IBDatabase, IBTarsaction, грид и кнопку.
в обработчике кнопки написал:
IBTransaction1.Rollback;
запустил, добавил в гриде несколько записей, нажал на кнопку, транзакция завершилась, датасет - IBTable, естесственно закрылся. Запускаю по-новому - записи на месте.
Правда, у меня Д5 а не Д6, но сомневаюсь, что там IBX изменился.
← →
Danilka (2003-05-27 09:09) [5]xmrz (27.05.03 08:59)
угу. по-моему, самый правильный вариант.
← →
Жук (2003-05-27 09:16) [6]
> xmrz (27.05.03 08:59)
Интересная идея ! Надо попробовать.
> Danilka © (27.05.03 09:05)
А при чём здесь IBX ? Автор указал, что у него IB6, а там другая картина с неявными трензакциями.
← →
Danilka (2003-05-27 09:21) [7]Жук © (27.05.03 09:16)
>А при чём здесь IBX ?
IBQuery, IBTransaction - это не IBX?
по-моему, в другие компоненты (тот-же FIBPlus) по другому называются.
← →
xmrz (2003-05-27 09:23) [8]> Жук
Самый большой плюс этого подхода очевиден в ситуации, когда тебе надо вставить сразу несколько записей со связью один_ко_многоим. Типа :
- клиент
- заявка 1
- заявка 2
- заявка 3
В несколько разных таблиц
← →
Жук (2003-05-27 09:25) [9]
> Danilka © (27.05.03 09:21)
По-моему мы в терминологии запутались...
← →
Жук (2003-05-27 09:26) [10]
> xmrz (27.05.03 09:23)
Но остаётся вопрос с позиционированием курсора :-(
← →
xmrz (2003-05-27 09:31) [11]> Жук
В смысле?
← →
Danilka (2003-05-27 09:31) [12]Жук © (27.05.03 09:25)
Наверно. Под IBX я понимаю стандартные дельфовые компоненты работы с IB, которые лежат на закладке InterBase.
Может, чего-то путаю :)) недавно начал с IB работать.
← →
Жук (2003-05-27 09:45) [13]
> xmrz (27.05.03 09:31)
> > Жук
> В смысле?
Вы ж говорите, что при вводе новой записи (данных в форму ввода) закрываете НД. Когда форма ввода закрывается, то его надо переоткрыть (с какими параметрами ?) и спозиционировать курсор на введённую запись. Так ?
← →
xmrz (2003-05-27 09:48) [14]Используй bookmark:
...
var i : pointer;
begin
i := DepDS.DataSet.GetBookmark;
ShowCurrent;
if Assigned(i) then
if DepDS.DataSet.BookmarkValid(i) then DepDS.DataSet.GotoBookmark(i);
...
← →
Жук (2003-05-27 09:54) [15]
> xmrz (27.05.03 09:48)
> Используй bookmark
1) Когда НД закрывается новой записи ещё нет, значит марка не поможет.
2) Записи НД где-то отображаются (z.b. грид). С какими параметрами вы переоткрываете НД ? Ведь свежевнесённая запись обязательно должна отобразиться.
← →
Жук (2003-05-27 09:55) [16]
> Danilka © (27.05.03 09:31)
> Жук © (27.05.03 09:25)
> Наверно. Под IBX я понимаю стандартные дельфовые компоненты
> работы с IB, которые лежат на закладке InterBase.
Угу. Понял. В Д6 неявные транзакции откатываются без проблем.
← →
Danilka (2003-05-27 09:57) [17]Вообще, я делаю так:
открываю транзакцию на чтение,
делаю активным IBQuery, на него у меня повешен ClientDataSet через DataSetProvider, который я тоже делаю активным.
закрываю IBQuery, завершаю транзакцию.
ClientDataSet, при этом остается активным, и в нем есть все записи, которые были в IBQuery.
А дальше уж можно делать с этими данными все что угодно.
Если юзеру надо записать данные, запуск транзакции, запись измененных данных и завершение транзакции происходят в одной процедуре.
← →
Danilka (2003-05-27 09:58) [18]Жук © (27.05.03 09:55)
ну, тогда моя ссылка устарела.
← →
xmrz (2003-05-27 10:02) [19]>Жук © (27.05.03 09:54)
1) bookmark больше подходит конечно при редактировании записей.
2) набор данных я обычно строю с сортировкой по времени вставки, поэтому если открыть его с преждними параметрами (при условии что в запросе нет условия которое отбросит свежевставленное значение как не удовлетворяющее выборке) и сделать ему Last, то курсор окажется как раз на нужной записи. Если же сортировка идёт не по времени вставки, тогда хранимая процедура должна возвращать ID вставленных данных, и потом в открытом НД ищи по этому ID через Locate.
← →
Жук (2003-05-27 10:20) [20]Тогда, наверное, оптимальный вариант :
1) Вставка Append"ом
2) Редактирование как
> xmrz (27.05.03 08:59)
> Danilka © (27.05.03 09:57)
> Вообще, я делаю так:
А на скорость это не влияет ?
← →
Danilka (2003-05-27 10:31) [21]Жук © (27.05.03 10:20)
Вроде со скоростью пока все ок, тормозов, или еще чего не заметил.
Страницы: 1 вся ветка
Текущий архив: 2003.06.19;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.009 c