![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Когда лучше подтверждать транзакции [D5, IB6.x]
Тучудище © (2005-06-29 15:06:00)Решил потихоньку осваивать IBX, в принципе все понятно с загадочным компонентом транзакция разобрался, одно только мне не совсем ясно наткнулся на статью в сети где четко и ясно написано что не стоит подтверждать транзакцию после добавления каждой новой записи(сбило с толку). Ув. мастера подскажите плиз, по какой логике надо действовать чтобы понять, когда ее нужно подтвердить...
Разберем пример обычного справочника
Пользователь добавил несколько запись
Вижу два варианта
1) Автоматическое подтверждение(Если после каждой вставки нельзя то когда)
2) Кнопка подтвердить транзакцию (сами знаете чем это грозит....)
Val (2005-06-30 12:00:00) [41]кстати, в песенке довольно вредный совет о необходимости частых коммитов в оракле.
Игорь Шевченко (2005-06-30 11:44:00) [42]msguns © (30.06.05 11:11) [15]
Нет конечно. Изначально в fido увидел, потом в инете нашел :)
msguns (2005-06-30 11:11:00) [43]Супер !!!
Сам придумал ?
Игорь Шевченко (2005-06-30 10:56:00) [44]"Hе секрет, что rollback надо делать пореже,
Лучше делать почаще commit!
Я программой своей скоро сервер повешу -
У админа пускай голова поболит.
Под крики о кастрации,
В обкуренной прострации,
Как следствие мутации
Рождается в момент
Rollback segment для маленькой,
Для маленькой такой транзакции,
Для скромной такой транзакции
Огромный такой сегмент!
Hе секрет, что rollback - это язва и грыжа,
Геморрой и чуть-чуть гайморит.
Если ты программист, а не ослик бесстыжий -
Лучше делай почаще commit!
Припев.
Hе секрет, что друзьям тоже надо ресурсы,
Hадо память, процессор и диск...
Так что делай commit, а иначе... ты в курсе,
Что rollback - для тебя неоправданный риск.
Припев. "
Sergey13 (2005-06-30 10:33:00) [45]>Хочется полялякать ? Я не против ;)
Да не то что бы сильно хочется. Хоть и не против (с приятным человеком приятно полялакать). Я уже догадываюсь, что ты скажешь. А ты наверное догадываешься, что я отвечу. 8-)
Я ведь переспросил просто так. 8-)
>Только эта.. давай в Потрепацца ;))
Можно и туда. 8-)
msguns (2005-06-30 10:27:00) [46]>Sergey13 © (30.06.05 09:57) [11]
Хочется полялякать ? Я не против ;) Только эта.. давай в Потрепацца ;))
Sergey13 (2005-06-30 09:57:00) [47]2[10] msguns © (30.06.05 09:47)
> лучше всего
Лучше чем что? Насколько лучше? 8-)
msguns (2005-06-30 09:47:00) [48]Для точного и корректного с логической точки зрения управления обменом данными с БД в интербэйз лучше всего читать в одной "долгоиграющей" транзакции, а писать в других - коротких.
Anatoly Podgoretsky (2005-06-29 20:09:00) [49]kaif © (29.06.05 16:01) [7]
Так это и есть транзакция в ее прямом толковании а не в компьютерном, единое неделимое действие.
Например при массовом копировании существуют две ситуации, каждая запись не зависима от другой - соответственно транзакция на каждую запись. Второй случай все записи должны быть скопированы полностью, не докопирование одной записи ведет к нарушению целостности - транзакция все записи. Промежуточных вариантов быть не может, это нарущение целостности или неэффективность.
Представим себе для первого случая рекомендацию делать копирование в транзакции по 100000 записей, пускай на записи 99999 произошла какая либо проблема, все предыдущии 99998 пошли насмарку. Получаем не экономию времени (а об транзакционности просто и говорить не призодится все 100000 операций независимы друг от друга), а получаем резкую его потерю, ничем не обоснованную.
Недавно мы устанавливали у себя базу MSSQL, где был импорт из ФоксПро. Весь импорт был атомарен, нельзя было закачать неверную информацию. Благодаря транзакционности мы получили целостную базу, а в процессе импорта были обнаружены несколько недопустимых значений в оригинале.
Без единой транзакции мы бы имели не консистентную систему и долго бы искали где проблема. А так просто методом деления пополам иы проблемы быстро обнаружили и устранили. В новой базе недопустимые значения уже появиться не могут.
Desdechado (2005-06-29 19:37:00) [50]транзакция - это последовательность действий с данными, которая либо выполняется целиком, либо не выполняется вовсе
в этом вся соль - все или ничего
случай, когда логически неделимый блок состоит из одной операции,- это частный случай
kaif (2005-06-29 16:01:00) [51]При добавлении одиночной записи в справочникимеет смысл подтверждать как раз сразу после добавления.
А вот при создании многострочногодокумента и особенно при его редактировании иногда удобно так устроить программу, чтобы коммитить или откатывать все изменения, внесенные пользователем в этот документ (вдруг он решит все эти изменениявообще не сохранять). Я обычно на окне "документа" делаю кнопку "сохранить". А при закрытии окна, если были несохраненные изменения, в OnCloseQuery формы спрашиваю примерно так:
procedure TMyForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if ModifiedButton.Enabled then
case MassageDlg('Сохранить изменения в документе таком-то?',
mtConfirmation, [mbYes, mbNo, mbCancel], 0) of
mrYes: SaveChanges;
mrCancel: CanClose := False;
end;
end;
procedure TMyForm.SaveChanges;
begin
with MyDataSet do
if State in [dsEdit,dsInsert] then
Post;
MyDataSet.Transaction.Commit;
ModifiedButton.Enabled := False;
end;
Пользователям это видится логичным.
Тучудище (2005-06-29 15:24:00) [52]Спасибо за ответы! они наставили меня на пусть истиный
Anatoly Podgoretsky (2005-06-29 15:22:00) [53]Тучудище (29.06.05 15:16) [3]
Смутило что нежелательно комитить после каждой записи
И правильно смутило, по сути это не верно, транзакцию надо подтвержадать когда она закончена, а не когда накопится что-то.
Эти рекомендации не связаны с транзакциями как таковыми, а с какой то оптимизацией какого то процесса и к транзакциям отношения не имеют. Быстродействие это совсем другой логический процесс и соответственно другой вопрос!
Zacho (2005-06-29 15:20:00) [54]Тучудище (29.06.05 15:16) [3]
Это действительно самый разумный вариант. Естественно, что модификация данных при этом должна производиться в отдельной транзакции.
Почитай, например, http://www.ibase.ru/devinfo/ibx.htm
Тучудище (29.06.05 15:16) [3]
Смутило что нежелательно комитить после каждой записи
Кому "не желательно" ? В каких случаях ? Случаи разные бывают ...
Тучудище (2005-06-29 15:16:00) [55]Кстати, это самый разумный вариант. Именно после каждой модификации данных делать Commit. Естественно, при массовой модификации данных желательно делать по другому.
При массовой вопросов нет! Смутило что нежелательно комитить после каждой записи
Zacho (2005-06-29 15:11:00) [56]Тучудище (29.06.05 15:06)
1) Автоматическое подтверждение(Если после каждой вставки нельзя то когда)
Кстати, это самый разумный вариант. Именно после каждой модификации данных делать Commit. Естественно, при массовой модификации данных желательно делать по другому.
Zacho (2005-06-29 15:08:00) [57]Почитай статьи на http://www.ibase.ru