![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа механизма транзакций в 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 читай, весь раздел Девелоперу/Транзакции.