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

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

Работа механизма транзакций в InterBase [D6, IB6.x]


PrettyFly ©   (2002-12-17 15:49:00) 

Запускаю 2 одинаковых приложения (с InterBase), в одном удаляю элемент A из таблицы, в другом добавляю элемент B, которой внешним ключём связан с A(т.е. нарушаю целостность из различных транзакций). Я всегда думал, что в таком случае механизм транзакций автоматически исправляет ошибки и позволяет продолжить работу, но приложение виснет... что делать?


Сергєєв Володимир   (2002-12-17 23:20:00) [1]

2 Prooksius ©
В четврег будет, ОК? Извини, тут приболел немного и не было
меня давно.


Prooksius   (2002-12-17 23:17:00) [2]

2 Сергєєв Володимир (17.12.02 22:37)
Все это более-менее работает при небольшом кол-ве юзеров.
При 100 юзерах ты заимеешься видеть на своем экране моргание от постоянных рефрешей или просто не сможешь работать.

P.S. А где обещаный подарочек за QReport??? :)))))))

2 PrettyFly © (17.12.02 15:49)
У тебя, как мы поняли, DeadLock.
Поэтому поставь при update параметр транзакции nowait.
Тогда у тебя прога будет вываливаться с ошибкой типа Master record missing или что-то в этом роде.


Сергєєв Володимир   (2002-12-17 22:37:00) [3]

Я это так решил.

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

При самой заваленной сетке на 10МБит (с учетом того, что директор с бухгалтером и товароведом в этот момент играют в Кваку) нужно вставить в дочернюю таблицу данные и удалить из родительской так, чтобы поймать DeadLock, примерно с точностью до 0,1 секунды, что очень трудно(хотя, как показала практика, возможно). Но с другой стороны, возникает иллюзия, что пользователи работают с одной таблицей, а не с ее локальными копиями в рамках их транзакций, т.к. изменения отображаются незамедлительно у всех.

Заодно в IBEvents напиши че-нить, чтобы когда они поймают события изменения в родительской таблице, в дочернюю уже нельзя было вставить лажевые данные.

Johnmen прав, никто ниче за тебя делать не будет.


Johnmen   (2002-12-17 18:20:00) [4]

>FreeLancer © (17.12.02 16:51)
>...значит кто-то кого-то обманывает...

Точно ! Все вокруг врут друг другу !!! :)))
Даже утверждая про зло...


FreeLancer   (2002-12-17 16:51:00) [5]


> PrettyFly © (17.12.02 16:43)
> try ... except ... end - это зло, попытка вместо исправление
> ошибок, закрыть на них глаза...

Это не зло, а как раз механизм для обработки ошибок. А ситуация, о которой вы тут спорите в нормальных условиях должна вызвать DeadLock. Если его нет, значит кто-то кого-то обманывает...


Johnmen   (2002-12-17 16:45:00) [6]

>Andriano © (17.12.02 16:34)

И что ? Причем здесьэто ?
Кто-то из нас явно не понял вопроса...И есть предположение, кто...:)


PrettyFly   (2002-12-17 16:43:00) [7]

try ... except ... end - это зло, попытка вместо исправление ошибок, закрыть на них глаза...


Johnmen   (2002-12-17 16:37:00) [8]

Вот там, где виснет, опоясываешь try ... except ... end
В чем проблема ?


Andriano   (2002-12-17 16:34:00) [9]

> Johnmen ©

Я о разделённых транзакциях. Просмотр в транзакции на чтение, а запись длиться миллисекундами в транзакции на запись. CommitRetaining тогда не к чему. Так как Read Transaction не закрывается.
В FIB это поддерживается. А в остальных можно делать запросом, составляемым динамически.


PrettyFly   (2002-12-17 16:29:00) [10]

Понятно, что не будет, но мне надо сделать так, чтобы при этом ещё и приложение не висло :)


Johnmen   (2002-12-17 16:22:00) [11]

>PrettyFly © (17.12.02 16:09)

Так он и не будет добавлять !


PrettyFly   (2002-12-17 16:09:00) [12]

Там по смыслу оба клиента должны вносить изменения. в данном же случае сервер должен был определить, что A - удалён. И просто не добавлять B. Как без этого может работать сетевая прога?


Johnmen   (2002-12-17 16:08:00) [13]

>Andriano © (17.12.02 16:00)

М-да.. И к чему это было сказано ?


Andriano   (2002-12-17 16:00:00) [14]

Ненадо никогда транзакции на запись открывать для browser-инга и жить станет легче.


Johnmen   (2002-12-17 15:57:00) [15]

"Никто за тебя ничего не сделает !"
Лучше руководствоваться таким принципом и самому обрабатывать ошибки...


Prooksius   (2002-12-17 15:55:00) [16]

Deadlock, похоже...
www.ibase.ru читай, весь раздел Девелоперу/Транзакции.


Наверх

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