![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ненадёжность связи и TpFIBDatabase.Execute [D7, firebird]
Николай 2 © (2008-09-09 16:19:00)Прога, соединившись с БД по инету (через GSM-модем), периодически обновляет её примерно так: pFIBDatabase.Execute('insert into ...').
Если Execute даёт false, он повторяется с теми же параметрами после восстановления и проверки связи.
Разрывы связи бывают часто.
Изредка в БД получаются дубли записей, т.е. в каждом таком случае Execute даёт false, несмотря на то, что запись упешно добавлена в БД.
Как можно решить эту проблему?
Николай 2 (2008-10-10 13:54:00) [1]Уникальное поле - пока не нужно.
Заменил pFIBDatabase.Execute на pFIBQuery с ручным управлением транзакциями. Похоже, помогло.
Не зря в одном факе настоятельно рекомендовали управлять вручную.
Sergey Masloff (2008-09-10 14:54:00) [2]Медвежонок Пятачок © (10.09.08 14:50) [21]
>Если бы она была атомарной, у автора не возникали бы описанные >симптомы.
Симптомы пока только у автора ;-)
Если бы все было так плохо они были бы у всех и постоянно.
Медвежонок Пятачок (2008-09-10 14:53:00) [3]И как тогда объяснить случай со свершившейся вставкой на сервере и тем что exec на клиенте вернул false?
Sergey Masloff (2008-09-10 14:51:00) [4]Медвежонок Пятачок © (10.09.08 14:43) [19]
Нет. Она получает ответ и посылает чек что она его получила. И если сервер этот чек не получил то реального коммита нет. Чтобы убедиться 100% надо смотреть исходники FB (я в этой части не смотрел) но ситуации когда коммит не прошел на клиенте а запись вставилась мне добиться не удалось при проведении стресс-тестов.
Медвежонок Пятачок (2008-09-10 14:50:00) [5]Атомарная операция
Если бы она была атомарной, у автора не возникали бы описанные симптомы.
Она атомарна логически, в категориях реляционной теории.
А этажом ниже передаются биты и байты (не один байт) по неустойчивым каналам связи.
Медвежонок Пятачок (2008-09-10 14:45:00) [6]Пока все не отрапортуют никакого реального коммита нет. Атомарная операция
Ой ли?
То есть я вызвал коммит, сервер мне ответил, все окей, убедился, что я принял его ответ, затем приступил к реальному закоммичиванию?
А если он при этом обломается?
Медвежонок Пятачок (2008-09-10 14:43:00) [7]При чем здесь коммит на сервере/не на сервере?
Чем с точки зрения тсп и ненадежного модема отличаются инсерт от коммита?
Ничем.
Клиентская либа посылает в тсп соединение данные и ждет ответа.
И если у автора нарушается этот цикл на инсерте (запись вставлена, а exec говорит что нет), то то же самое может случиться и с коммитом.
Sergey Masloff (2008-09-10 14:41:00) [8]Медвежонок Пятачок © (10.09.08 14:38) [16]
Что коммит сделается на сервере а до клиента это не дойдет? Там же с установкой соединения сессия. Пока все не отрапортуют никакого реального коммита нет. Атомарная операция
Sergey Masloff (2008-09-10 14:40:00) [9]Sergey Masloff (10.09.08 14:36) [15]
Хотя что-то подобное возможно в СУБД где commit можно на сервере делать.
Например в Oracle - но это другая песня.
Медвежонок Пятачок (2008-09-10 14:38:00) [10]Какая именно ситуация?
Sergey Masloff (2008-09-10 14:36:00) [11]Медвежонок Пятачок © (10.09.08 13:52) [14]
Это шутка или полное незнакомство с работой клиентского протокола?
Если нетрудно назовите СУБД в которой такая ситуация возможна.
Медвежонок Пятачок (2008-09-10 13:52:00) [12]попытка коммита без связи ни к чему не приведет
Ситуация:
Связь есть.
Посылаем коммит.
Он (команда) долетает до сервера.
Сервер выполнил коммит и хочет вернуть результат клиенту.
А связи уже нет.
Медвежонок Пятачок (2008-09-10 13:50:00) [13]попытка коммита без связи ни к чему не приведет
Это на тему ограничься управлением транзакциями.
Мне вот интересно как он в такой среде будет это делать.
Николай 2 (2008-09-10 12:09:00) [14]Всем спасибо за ответы.
Медвежонок Пятачок
Короче, просто управление транзакциями не поможет?
Каким способом лучше передать блоб?
Johnmen
Дык, вроде, TpFIBDatabase в этом случае сам управляет транзакцией: DefaultTransaction и DefaultUpdateTransaction заполнены - на форме есть компонент TpFIBTransaction с TimeoutAction=TARollback.
Правильный$Вася (2008-09-10 12:06:00) [15]
> и делал коммит когда связь прервалась
попытка коммита без связи ни к чему не приведет
Медвежонок Пятачок (2008-09-10 00:35:00) [16]когда потухает мопед, происходит как бы роллбак
Ага. А чувак уже внял советам ограничится управлением транзакциями и делал коммит когда связь прервалась.
sniknik (2008-09-09 23:25:00) [17]> А зачем такие сложности?
вовсе не сложности, постоянно с таким работаю, обычно по естественному ключу, например составному -> подразделение-магазин-отдел-касса-z отчет-чек-номер позиции
однозначно идентифицирует запись в общей базе хоть со всего города, и разных фирм... позволит обновлять даже задним числом. исправлять, если проблема с первоисточником (сломалась фискалка, z отчет неправильный, закрыли не видя части продаж... цто исправило, локальную базу восстановило. в глобальной что тоже искать, совмещать, и восстанавливать? нет. просто перепослать отчет и все. все что пришло частично станет полным.)
правда в реальных базах обычно чуток посложнее, там еще заголовки по документам с суммами, что позволяет делать проверку целостности по суммам автоматом, и другая фигня.
но это вовсе не сложно.
не сложнее чем делать после проверку все ли дошло не имея подобного "якоря" по которому можно связать записи. ну пример с обоих концов по миллиону записей, все правильно? а может одна запись не дошла и одна задублировалась? ты говоришь у меня все правильно, а бухгалтер, "это у меня суммы не бьют", и тоже уверен что у него все правильно. и?
> Я хоть сам старый маньяк с хранимками
не путай маньячество с целесообразностью... хранимка сама по себе ничего не дает. как самоцель вообще вред только от нее. а поле связи только выгоды.
Johnmen (2008-09-09 23:20:00) [18]когда потухает мопед, происходит как бы роллбак
Медвежонок Пятачок (2008-09-09 22:44:00) [19]хватит, особенно если нужно сделать коммит/роллбак а мопед уже потух.
Sergey Masloff (2008-09-09 22:32:00) [20]sniknik © (09.09.08 22:24) [5]
А зачем такие сложности?
Я хоть сам старый маньяк с хранимками но тут управления транзакциями вполне хватит.