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

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

ненадёжность связи и TpFIBDatabase.Execute [D7, firebird]


Страницы:   1 2

Николай 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]
А зачем такие сложности?
Я хоть сам старый маньяк с хранимками но тут управления транзакциями вполне хватит.


Страницы:   1 2

Наверх

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