Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при вставке записи и коммит транзакции [D7, FireBird 1.5.3]


pavel_guzhanov ©   (2007-05-08 14:22:00) 

Здравствуйте!

Подскажите пожалуйста в таком теоретическом вопросе. Я в цикле вставляю записи в базу. Для вставки использую хранимую процедуру. Цикл повторяется много раз (допустим, 10000) После выхода из цикла я делаю IBTransaction.commit. Все проходит без ошибок. А если произойдет следующее: Во время одной итерации цикла вставятся некорректные данные. При выполнении коммита после цикла вставится что-нибудь в базу? И что вставится? Все данные до ошибочной записи? Или вообще ничего не вставится?


Johnmen   (2007-05-08 17:36:00) [1]


> А если произойдет следующее: Во время одной итерации цикла
> вставятся некорректные данные. При выполнении коммита после
> цикла вставится что-нибудь в базу? И что вставится?

Закоммитится всё, что успешно вставилось.


ANB   (2007-05-08 15:39:00) [2]


> После цикла идет принудительный коммит, но в базе не появляется
> ни одной записи...

У тебя до коммита явно выполнение не доходит.
Значит, все остается на усмотрение деструктора TIBTransaction.
Вроде как в нем можно настраивать, чего он должен сделать при выходе из программы - коммит или роллбэк.
А до выхода из программы добавленные записи никто не увидит, кроме твоей же программы (да еще и из той же транзакции).


Desdechado   (2007-05-08 15:37:00) [3]

Если твоя хранимая процедура сама обрабатывает исключительные ситуации, то на клиента их отдавать не нужно, т.е. транзакцию можно подтвердить.


pavel_guzhanov   (2007-05-08 15:27:00) [4]


> записи сядут в базу окончательно, а если роллбэк - то отваляться

Все-таки не так... После цикла идет принудительный коммит, но в базе не появляется ни одной записи...

> Но я не увидел по тексту, что автор перехватывал исключения
> и делал роллбэк.

Я не перехватывал исключений, и, соответственно, не делал роллбэка....


ANB   (2007-05-08 15:21:00) [5]


> Именно так. Если транзакция работает именно так, как ты
> описал.

Вообще то тут код надо смотреть.
Но я не увидел по тексту, что автор перехватывал исключения и делал роллбэк.
ИМХО :
Т.к. инсерты идут не одним оператором, а в цикле, то получив исключение на ошибочной записи, процедура прервется и БД останется в незакоммиченном состоянии. При этом ранее добавленные записи окажуться в подвешенном состоянии.
Далее, если при выходе из приложения у него пройдет автоматический коммит, то записи сядут в базу окончательно, а если роллбэк - то отваляться.


Sergey13   (2007-05-08 14:36:00) [6]

> [0] pavel_guzhanov ©   (08.05.07 14:22)
> Или вообще ничего не вставится?

Именно так. Если транзакция работает именно так, как ты описал.


Наверх

Титульная страница Поиск, карта сайта Написать письмо