![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос в IBX... [D7, IB6.x, FB1.5]
DimaK © (2004-12-29 09:39:00)Как сделать кучу insert в одной транзакции.
Пока я делаю так:
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('insert .....');
IBQuery1.ExecSQL;
IBQuery1.Close;
- это для каждого инсерта. Пытался запихать несколько строк IBQuery1.SQL - он начинает ругаться на второй строке типа "token 'insert' unknown" что то.
А как я вижу у меня Commit происходит после каждого IBQuery1.ExecSQL. А хотелось бы делать commit после последнего инсерта (или Rollback). Вообще на IBX как такое организуется? Можно примерчик?
Max Zyuzin (2004-12-29 16:46:00) [1]>DimaK (29.12.04 15:53) [10]
Вполне, она ж у тебя читает... прочитай еще раз msguns © (29.12.04 11:05) [2] очень полезный совет
DimaK (2004-12-29 15:53:00) [2]Спасибо, вроде разобрался.
И тогда еще вопрос по транзакциям: посоветуйте параметры транзакции, на которой IBStoredProc1 висит, и который возвращает всего 10 параметров по результатам кучи запросов и не производит никакие изменения с таблицей (ну короче хитрые суммы для отчета считает). И вообще ничего если его посадить на ту же "читающую" транзакцию на которой висят просматриваемые таблицы (вьюхи)?
Johnmen (2004-12-29 12:00:00) [3]>msguns © (29.12.04 11:52) [8]
Нет-нет, именно при массовой вставке, ничего с целостностью не имеющей. Т.к. "целостность" в данном случае это вставка всех записей.
>Вчера в старкрафт переиграл ? ;)
Не совсем... Реплеев пересмотрел...:)
msguns (2004-12-29 11:52:00) [4]>Johnmen © (29.12.04 11:45) [5]
>Уточню, что при массовой вставке завершать надо после 100-500 записей. Отключить индексы. Отключить ForceWrite.
Жень, давай вместе прочитаем еще раз [3]:
"Пишущая" транзакция используется для проведения одиночных либо каскадных (цепочных) целостных модификаций в одной либо группе логически связанных таблиц. По завершению каждой целостной модификации либо по краху в любой ее части транзакцию коммитить либо откатывать явно (Commit/RollBack без Retaining).
Если в понятие "целостности" входит как частный случай, вставка 500 записей, значит именно после 500-й и надо коммитить.
Что-то ты сегодня не в форме. Вчера в старкрафт переиграл ? ;)
Johnmen (2004-12-29 11:49:00) [5]>Sergey13 © (29.12.04 11:47) [6]
>Ну это наверное только при оч-ч-ч-чень массовой. 8-)
Ну да. При очень массовой и нерегулярной :)
Sergey13 (2004-12-29 11:47:00) [6]2[5] Johnmen © (29.12.04 11:45)
>Отключить индексы. Отключить ForceWrite.
Ну это наверное только при оч-ч-ч-чень массовой. 8-)
Johnmen (2004-12-29 11:45:00) [7]>msguns © (29.12.04 11:05) [2]
>После каждой записи - завершение транзакции
Уточню, что при массовой вставке завершать надо после 100-500 записей. Отключить индексы. Отключить ForceWrite.
msguns (2004-12-29 11:18:00) [8]Да, забыл добавить: после подтверждения "пишущей" транзакции все визуализированные НД, открытие в контексте "читающей" транзакции, необходимо переоткрывать (имеются в виду те НД, которые содержат данные, потенциально модифицированные "пишущей" транзакцией) или профетчивать.
msguns (2004-12-29 11:15:00) [9]Параметры "читающей" транзакции:
Read (не обязательно)
Read_commited,
NoWait
И "пишущей":
Write
Concurrency
NoWait
"Читающая" транзакция может быть открыта длительное время, она практически не тормозит сервер. В ее контексте можно читать данные для визуализации произвольного кол-ва таблиц (вьюх)
"Пишущая" транзакция используется для проведения одиночных либо каскадных (цепочных) целостныхмодификаций в одной либо группе логически связанных таблиц. По завершению каждой целостной модификации либо по краху в любой ее части транзакцию коммитить либо откатывать явно (Commit/RollBack без Retaining).
Есть, правда, случаи использования одной транзакции для чтения и модификации "в одном стакане", например, обслуживание справочника или автономной таблицы БД. В этом случае транзакция завершается после попытки изменения без завершения (точнее с рестартом): CommitRetaining/RollBackRetaining
msguns (2004-12-29 11:05:00) [10]>DimaK (29.12.04 09:39)
> IBQuery1.Close;
А вот это-то зачем ?
>А как я вижу у меня Commit происходит после каждого IBQuery1.ExecSQL
Каким образом видишь ? Может в контексте той же транзакции, которой меняешь, а Read_commited отсутствует ?
Классический правильный способ работы с IB: две транзакции - одна "долгоиграющая" читает (TIBQueryes), другая кратковременная пишущая (TIBSQL`s). После каждой записи - завершение транзакции. Схема, конечно, упрощенная, но верно отражает принцип разделения обмена данными с клиентами на 2 основные целостныегруппы: только читающую и только модифицирующую.
Johnmen (2004-12-29 09:53:00) [11]Так управляй транзакциями сам. В чем проблема то ?
И см. IBScript.