![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FK в IB6.0 - Firebird. Невозможно массовое удаление-добавление [D5, IB6.x]
kaif © (2002-06-28 23:17:00)Имеется таблица Table1 (ID, ID2, NAME).
Имеется таблица Table2 (ID, NAME).
Имеется декларативная ссылочная целостность
alter table1 add constraint fk_table1_to_table2
foreign key(ID2) references Table2(ID).
1.Вставляем 10000 записей в Table1.
2.Выходим из приложения.
3.Соединяемся еще раз и удаляем 10000 записей из Table1.
4.Вставляем 10000 новых записей в Table1.
5.Выходим из приложения.
6.Соединяемся еще раз. Делаем любой SELECT запрос к таблице Table1.
7.Пытаемся выйти из приложения. Сервер виснет. Процессор не занят. Никакие действия с сервером (другое соединение) невозможны. Искусственное прекращение работы сервера (снять задачу) приводит к разрушению базы данных (orphan pages).
---------------------
Без foreign key такого не происходит.
Я провел сотни экспериментов. Менял сервер (IB6, Firbird). Менял параметры транзакции (snapshot, consistency, read committed). Все без толку. Описанные выше 7 шагов вешают сервер. Не завершает работу функция клиента
isc_detach_database.
Любопытно, что если подождать минут 20-30, приложение все же завершается. Однако все это время оно ничем не занято, к диску тоже обращений не происходит. Я слежу по Task Monitor NT4. То же положение и в Windows"98. Спокойно можно запускать другие приложения и работать.
Чем занят сервер?
Кто знает?
Ссылочная целостность через FK и так уже мне крови попортила достаточно. Но это уже полный беспредел...
Alexandr (2002-07-04 06:37:00) [1]ну раз вопрос снят, то я уже отвечать не буду...
kaif (2002-07-03 20:12:00) [2]Поставил Yaffilss821.
Все работает идеально.
Вопрос снят.
kaif (2002-07-03 12:48:00) [3]Там еще написано
НЕ ЗАБЫВАЙТЕ ОБНОВЛЯТЬ intl\gdsintl.dll
А как используется этот файл и кем?
kaif (2002-07-03 12:45:00) [4]Alexandr, простите
а в чем разница между RC2 и RC3?
Там в download:
Сборки WIN32 (суперсервер)
RC3 (821) 1.5 Мб
RC2 (800) 1.5 Мб
kaif (2002-07-03 12:40:00) [5]Хорошо. Попробую сегодня скачать Yaffil SS 819. Но как его ставить? Я последний раз поставил Yaffil на голову Interbase. Просто скопировал файлы сервера и gds32.dll кинул в System32 (у меня NT4). Но получил значительное падение скорости плюс какие-то ошибки. Как правильно его ставить? Есть тонкости?
Alexandr (2002-07-03 07:09:00) [6]Yaffil SS 819
все работает и ничего нигде не виснет проверено.
Firebird 682
зависания продолжаются...
Юзайте Yaffil, господа и волосы станут мягкими и шелковистыми
Alexandr (2002-07-03 06:42:00) [7]в мыло!
kaif (2002-07-02 14:51:00) [8]После третьего Insert-Update (помните?)
висю уже 17 минут.
kaif (2002-07-02 14:37:00) [9]Я пишу приложение на рынок (альтернатива 1С). Я очень опасаюсь за сохранность базы. Очнь вероятно, что пользователь, увидев, повисшее даже на 2 мин. приложение, просто убьет его с помощью Ctrl+Alt+Del. После этого сервер работать не будет. Придется и его убить так же. Потом стартовать. Восстановление базы с 200 orphan pages не получается без отключения ignore check sum. После такого восстановления индексы получаются неправильные и многое выпадает. Нужно восстанавливать индексы. В большинстве случаев базу просто приходится выкинуть.
А расчет с удалением-вставкой тысяч строк вполне обычное дело при перерасчете себестоимости списанных товаро и других подобных задачах.
Одним словом это хана.
Мне нужно найти какой-то надежный выход.
Кстати, висю уже 7 мин.//////////
Я уже убрал всю ссылочную целостность из базы и из программы в тех местах, гда она создавалась.
Я готов все это восстановить, если найду решение.
Иначе придется ее поддерживать руками в отдельных транзакциях с клиента.
----------
Неужели у тебя не происходит зависания на ReadCommitted?
Может мне опять менять сервер?
kaif (2002-07-02 14:26:00) [10]Да. Я только что проверил еще раз, перекомпилировав с ReadCommitted.
1. Восстановил пустую базу из *.gbk
2. Отключил IBConsole.
3. Нажал Insert-Update 10000.
4. Нажал Select
5. Нажал Disconnect
6. Нажал Insert-Update 10000.
7. Нажал Select
8. Нажал Disconnect
9. Провисел 3 мин.///////////////////
10. Нажал Insert-Update 10000.
11. Нажал Select
12. Нажал Disconnect
13. Вот уже висю 5 мин.//////////////////
Alexandr (2002-07-02 13:58:00) [11]А что, у тебя и на ReadCommited такое появляется?
kaif (2002-07-02 13:50:00) [12]>2 Alexandr © (02.07.02 06:32)
Я начинал эксперименты с Read Committed. Именно тогда проявилась эта ошибка. Это уже потом я играл с транзакциями. Но безуспешно. Вопрос в том, что это не уборка мусора, так как при этом невозможно новое подключение к серверу и процессор ничем не занят. Такое впечатление, что сервер попадает в какой-то тупик на "счетчике подключений" и просто чего-то ждет на функции вроде WaitForSingleObject... или что-то в этом духе.
Alexandr (2002-07-02 06:32:00) [13]сдается мне, дело в параметре транзакции
read-write table stability
если поставить чего попроще (я пробовал read Commited) то все нормально... вроде бы.
kaif (2002-07-01 15:06:00) [14]2Alexandr ©
Спасибо за помощь. До завтра.
Alexandr (2002-07-01 14:38:00) [15]ОК.
Действительно проблема с последним отключающимся от базы.
И действительно такая бага имеет место быть - т.е. последний всегда долго отключается из-за сборки мусора.
И бага эта известна, но не помню я исправили ее или нашли как ее обойти.
Другое дело, что уж очень долго последний отключается...
Остальное завтра.
kaif (2002-07-01 14:20:00) [16]У меня такое впечатление, что ошибка не возникает, если есть еще хоть одно соединение с той же базой.
Отключите все соединения с сервером и попробуйте еще раз.
kaif (2002-07-01 14:12:00) [17]Я пробовал на Yaffil 809 (по-моему, тоже Superserver)
Alexandr (2002-07-01 14:09:00) [18]1) Мыло дошло.
2) Я по мылу ответ написал. Пора переходить общаться в мыло.
3) Программа работает.
4) Щас пытаюсь ее повесить... пока попытки неуспешны. :)
5) Я чтоб программу не перегружать просто кнопку сделал с кодом
db.Connected:=False;
db.Connected:=true;
кстати проверяю я на Yaffil Classic Server 819 сборки.
Щас еще на Firebird попробую...
kaif (2002-07-01 14:07:00) [19]Странно. Я тоже добавил кнопку db.Connected := False. После уже второго нажатия Insert-Update у меня на дисконнекте все повисло. Сервер Firebird-1.0.0.796-Win32.exe (стоит как суперсервер, по моему).
Письма пока не получил. Пишите мне пожалуйста на ashot@vallex.ru. Остальные ящики сейчас у меня недоступны.
Alexandr (2002-07-01 13:47:00) [20]1) Мыло дошло.
2) Я по мылу ответ написал. Пора переходить общаться в мыло.
3) Программа работает.
4) Щас пытаюсь ее повесить... пока попытки неуспешны. :)
5) Я чтоб программу не перегружать просто кнопку сделал с кодом
db.Connected:=False;
db.Connected:=true;
кстати проверяю я на Yaffil Classic Server 819 сборки.
Щас еще на Firebird попробую...