Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по транзакции в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
6-60307
Jaguar
2003-04-08 14:32
2003.06.19
Proxy-сервер, FTP-протокол


1-60223
Rel_
2003-06-05 15:46
2003.06.19
работа с памятью


8-60268
NeoClub's Lider
2003-03-04 23:40
2003.06.19
Звук в Дельфине 5.0


1-60254
alexus
2003-06-05 17:04
2003.06.19
Интерактивное добавление компонентов на форму


1-60151
volodya_
2003-06-06 14:04
2003.06.19
Приведение типов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский