|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Есть клиентский компьютер. С одной стороны он общается с SQL сервером, с другой - с фискальным принтером. О принтере достаточно знать, что он принимает данные, печатает билет, пишет его себе в фискальную память и возвращает "ОК", если все получилось, либо всякие "ERR" в противном случае. SQL-сервер ведет учет проданных билетов. Требуется: при сбоях в любой момент времени (потеря связи с сервером, потеря связи с кассовым аппаратом, падение клиенского компьютера) обеспечить согласованность содержимого базы SQL-сервера и фискальной памяти принтера. Например, ситуация: - начали транзакцию, - послали данные в принтер, - он напечатал билет и сохранил в фискальную память, - вернул OK - клиентский комп повис, не успев сказать COMMIT - SQL сервер, потеряв из виду клиента и не услышав COMMIT, откатил его транзакцию - имеем: билет в фискальной памяти есть, а в БД нет. Кто как выкручивается? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2009, 15:02 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Cane Cat FisherКто как выкручивается?Решение уже десятки лет используется только одно: разделение бизнес-транзакций и транзакций БД. Т.е. делаете 2 транзакции БД 1. Перед отправкой данных в принтер 2. После получения ответа от принтера. Тогда вы сможете разобраться потом с фискальной памятью принтера. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2009, 15:33 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Cane Cat Fisher пишет: > - начали транзакцию, > - послали данные в принтер, > - он напечатал билет и сохранил в фискальную память, > - вернул OK > - клиентский комп повис, не успев сказать COMMIT > - SQL сервер, потеряв из виду клиента и не услышав COMMIT, откатил его > транзакцию > - имеем: билет в фискальной памяти есть, а в БД нет. Вообще чисто формально для этого нужны распределённые транзакции. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2009, 17:49 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Вы описываете онлайновую кассу, что временами очень нехорошо. Если по правильному, то кассе должна быть офф-лайновой(т.е. с локальным сервером) с механизмом обновления/репликации с центральным сервером. Именно так поступают в супермаркетах. Касса без лок.сети будет работоспособна. При появлении сети она прозрачно синхронизируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2009, 18:17 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
MasterZiv Вообще чисто формально для этого нужны распределённые транзакции. Конечно, было бы здорово, если бы из фискального принтера торчал хвост небольшого SQL-сервера, чтобы привязать его к хвосту большого, и пусть договариваются и гарантируют. А клиент чисто командует. Как сказал поэт: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Но, к сожалению, эти распределенные транзакции с принтером придется городить самому. Вот и интересно - неужели все и везде это делают, и если делают, то как именно? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 09:49 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
LSVВы описываете онлайновую кассу, что временами очень нехорошо. Если по правильному, то кассе должна быть офф-лайновой(т.е. с локальным сервером) с механизмом обновления/репликации с центральным сервером. Здесь немного не тот случай - продаются билеты на автобусы. Поэтому работа в оффлайне не имеет смысла - нужно всегда знать актуальное наличие свободных мест. Если их хоть чуть-чуть закешировать, мы же разными кассами два билета на одно место продадим. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 09:53 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Cane Cat FisherLSVВы описываете онлайновую кассу, что временами очень нехорошо. Если по правильному, то кассе должна быть офф-лайновой(т.е. с локальным сервером) с механизмом обновления/репликации с центральным сервером. Здесь немного не тот случай - продаются билеты на автобусы. Поэтому работа в оффлайне не имеет смысла - нужно всегда знать актуальное наличие свободных мест. Если их хоть чуть-чуть закешировать, мы же разными кассами два билета на одно место продадим.Записывайте данные на главный сервер и на локальный(да хоть в тхт-файл). С механизмом сравнения. ЗЫ: Когда-то делал онлайновую кассу. И там некот. данные писались в тхт-файл и позже сравнивались с сервером на случай, когда после печати чека вдруг рвалась связь. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 10:11 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Cane Cat FisherMasterZiv Вообще чисто формально для этого нужны распределённые транзакции. Конечно, было бы здорово, если бы из фискального принтера торчал хвост небольшого SQL-сервера, чтобы привязать его к хвосту большого, и пусть договариваются и гарантируют. А клиент чисто командует. ... Но, к сожалению, эти распределенные транзакции с принтером придется городить самому. Вот и интересно - неужели все и везде это делают, и если делают, то как именно?Красиво звучит - "Распределённая Транзакция", только вот непонятно, как эти распределённые транзакции помогут. Результат будт такой-же, как и в первоначальном варианте - чек на руках есть, записи в БД нет. Вариант, как говорилось, только один. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 11:15 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
alexeyvg пишет: > Красиво звучит - "Распределённая Транзакция", только вот непонятно, как > эти распределённые транзакции помогут. Результат будт такой-же, как и в > первоначальном варианте - чек на руках есть, записи в БД нет. Если бы была распр. транзакция, такого не могло бы быть. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 11:25 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Получается что-то такое (кусок обсуждения). Просьба прокомментировать. ------------------ ...Дело в том, что непонятно, какой момент (сигнал) считать гарантией напечатанности (или наоборот, ненапечатанности) билета. Нет такого сигнала. Вот, например, тонкий момент: A. Посылаем на аппарат последнюю команду FISC B. Он печатает строку "ФИСКАЛЬНЫЙ ЧЕК", заносит данные в фискальную память. C. Возвращает OK. Если между B и C порвется связь с компьютером, аппарат все же завершит печать и запишет в память. Даже обнаружив, что ему некому посылать OK, он же не будет втягивать назад билет и стирать фискальную запись? А нам (клиентскому компьютеру) что делать, послав на A.FISC и не получив на C.OK ? Подтверждать транзакцию, записывать в базу данных проданный билет? Нельзя, потому что после команды FISC аппарат мог, например, повиснуть, выдернуться из розетки, и не выполнить шага B. Не записывать, откатывать? Но тогда получим расхождение - шаг B, возможно, выполнен, и билет, возможно, напечатан, продан и записан в фискальную память. Здесь напрашивается, что нужно особенным образом обрабатывать ошибки потери связи. Организовывать нечто вроде журнала транзакций печати, и после сбоя просматривать его, докатывая или откатывая аварийно прерванные сеансы печати. Для этого в таблице проданных билетов (неважно, как там организованно, говорю условно) добавить логическое поле - "Начата печать". Последовательность действий печати билета при отсутствии ошибок такая: 1. Перед печатью билета запросить у аппарата номер последнего напечатанного билета. 2. Заносим в БД запись о билете, с его новым номером (последний напечатанный + 1), как о проданном, но пока что с флагом "Начата печать". 3. Отправляем в кассовый аппарат все команды. 4. Если получено последнее OK, снимаем у билета флаг "Начата печать". Теперь он считается проданным. Таким образом, если прервется связь, в базе останется билет с флагом "Начата печать". Флаг означает, что его судьба неизвестна, и ее надо выяснять. Для этого, между шагами 1 и 2 всегда выполняем шаги: 1.1. Проверить в БД наличие записи с флагом "Начата печать". Если нет - к шагу 2. 1.2. Сверяем номер этого билета с полученным на шаге 1 от кассы последним напечатанным билетом. 1.3. Если последний напечатанный в аппарате равен сохраненному в базе, значит, билет был успешно напечатан. Молча снимаем флаг "Начата печать". Теперь билет считается полноценно проданным и учтенным, как в БД, так и в фискальной памяти аппарата. Переход к шагу 2. 1.4. Если же последний напечатанный в аппарате меньше сохраненного в базе, значит, он не был напечатан, и его нет в фискальной памяти. Тут нужно спросить у оператора примерно следующее: "Предыдущий билет <реквизиты билета> не был напечатан, и не учтен в кассовом аппарате. Напечатать? Отказаться?" Если Напечатать - 1.5. Отправляем в кассовый аппарат все команды ЭТОГО билета. 1.6. Если получено последнее OK, снимаем у этого билета флаг "Начата печать". Теперь он считается проданным. Переход к шагу 2. Если Отказаться - 1.7. Удаляем запись из БД. -------------------------------------- Билеты с флагом "Начата печать" не должны учитыватся в финансовых отчетах. Вообще, перед закрытием дня, когда все кассы уже заведомо закрыты (в смысле окошки закрыты, пассажиров нет), нужно делать на каждом рабочем месте "Проверку на недопечатанный билет" по тому же принципу 1 - 1.1. - 1.4. Только, в 1.4, наверное, можно не спрашивать оператора про перепечатку, а молча выполнять выбор "Отказаться" и 1.7 - то есть, если билет не учтен в аппарате, то и в базе ему делать нечего. Еще нужно сделать общий отчет для администратора о наличии в базе недопечатанных билетов, чтоб гонять нерадивых кассиров. В общем, как ни обрамляй все это SQL-транзакциями, без этого куска ручных проверок все равно не обойтись, потому что кассовый аппарат получается "транзакционно безответственный", и за ним все равно нужно перепроверять - обрамлять его своей бизнес-транзакцией. -------------------------------------- ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 11:39 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
MasterZiv alexeyvg пишет: > Красиво звучит - "Распределённая Транзакция", только вот непонятно, как > эти распределённые транзакции помогут. Результат будт такой-же, как и в > первоначальном варианте - чек на руках есть, записи в БД нет. Если бы была распр. транзакция, такого не могло бы быть. Кратко, но непонятно, почсему не могло быть. Распределённая транзакция - это гарантия того, что изменения в распределённой системе подтверждаются или откатываются целиком. Т.е. при ошибке в одном из участников транзакции транзакция откатывается целиком на всех частях распределённой системы. Т.е. при ошибке клиентского компьютера транзакции откатываются целиком на сервере и клиентском компьютере. Если ошибка клиентского компьютера возникла после выдачи чека клиенту, то для полного отката нужен человекоподобный робот, который выхватит чек из рук клиента. Может, я что то упустил в логике, но мне кажется, что проблему ТС я описал правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 12:19 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
alexeyvg пишет: > Если ошибка клиентского компьютера возникла после выдачи чека клиенту, > то для полного отката нужен человекоподобный робот, который выхватит чек > из рук клиента. Ты прав, нужен. Или нужно выдавать чек только в случае успешного завершения транзакции. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 12:54 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
MasterZivИли нужно выдавать чек только в случае успешного завершения транзакции. Это тоже не подойдёт. Тогда будет обратная ситуация, зафиксированные транзакции без чека. ТС-же это всё описывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 13:16 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
alexeyvgЕсли ошибка клиентского компьютера возникла после выдачи чека клиенту, то для полного отката нужен человекоподобный робот, который выхватит чек из рук клиента. Нет, в этом случае не так. Если уж билет попал в руки пассажиру, тут не откатывать, а докатывать надо. Говоря языком распределенных транзакций, если ошибка клиентского компьютера возникла после выдачи билета клиенту, то на всех частях распределенной системы уже должно быть достаточно информации, чтобы при обработке сбоя эту транзакцию подтвердить. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 14:56 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Cane Cat FisheralexeyvgЕсли ошибка клиентского компьютера возникла после выдачи чека клиенту, то для полного отката нужен человекоподобный робот, который выхватит чек из рук клиента. Нет, в этом случае не так. Если уж билет попал в руки пассажиру, тут не откатывать, а докатывать надо. Говоря языком распределенных транзакций, если ошибка клиентского компьютера возникла после выдачи билета клиенту, то на всех частях распределенной системы уже должно быть достаточно информации, чтобы при обработке сбоя эту транзакцию подтвердить.Правильно, вот я про это и говорил первым-же ответом. А цитата выше относится не к распределённой системе, а к распределённой транзакции (вы, наверное, не прочитали даскуссию по этому поводу); я возражал против того, что возможность отката всех изменений сама по себе позволит решить указанную задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 15:57 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
alexeyvgА цитата выше относится не к распределённой системе, а к распределённой транзакции (вы, наверное, не прочитали даскуссию по этому поводу); я возражал против того, что возможность отката всех изменений сама по себе позволит решить указанную задачу. Не вижу никакого противоречия. Ведь распределенная транзакция - это не только ценный мех возможность всеобщего отката, но и возможность всеобщего подтверждения, даже после сбоя связи. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2009, 23:21 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
В СУБД (в Oracle, в частности, но вообще это общий механизм), поддерживающих распределенные транзакции используется механизм двухфазной фиксации. Однако, даже этот механизм не позволяет на 100% гарантировать согласованный откат или подтвержденеи распределенной транзакции на всех узлах. Даже такое состояние есть - "зависшая транзакция" (in-doubt transaction). Это распределенная транзакция, в отношении которой узлом не получено окончательное подтверждение. Такие транзакции должен откатывать или подтвердждать администратор вручную на основе анализа состояния этой же транзакции на остальных узлах. В данном же случае нужно использовать аналогичный механизм двухфазной фиксации и быть готовым к появлению "зависших транзакций", с которыми разбираться вручную. Соответственно сценарий работы будет следующим: 1. начали транзакцию 2. создали в БД документ (чек, билет,...) со статусом "черновик" 3. закоммитили транзакцию. 4. заблокировали документ в БД (SELECT FOR UPDATE) 5. постали данные в фискальный регистратор (принтер) 6. получили подтверждение ОК и поменяли статус в БД с "черновик" на "ок". А если получили ошибку, то удалили документ из БД. Список зависших транзакций в данном случае - это список НЕ заблокированных записей в БД со статусом "черновик". ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2009, 11:18 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Aqwerty wrote: > В СУБД (в Oracle, в частности, но вообще это общий механизм), > поддерживающих распределенные транзакции используется механизм > двухфазной фиксации. Однако, даже этот механизм не позволяет на 100% > гарантировать согласованный откат или подтвержденеи распределенной > транзакции на всех узлах. Конечно, ЭТОТ механизм не позволяет. Потому что он сугубо локальный. Другой механизм, а именно, распределённая транзакция -- позволяет. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2009, 16:08 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
MasterZivКонечно, ЭТОТ механизм не позволяет. Потому что он сугубо локальный. Другой механизм, а именно, распределённая транзакция -- позволяет. Двухфазная фиксация - как раз не локальный механизм, а механизм обеспечения работы распределенных транзакций. И поддерживается он не только в Oracle, а во многих и многих СУБД, т.е. это некий обобщенный стандарт. Разные СУБД реализуют этот механизм немного по разному, но общая архитектура (идея) одинаковая везде. Если Вы знаете какой-то другой используемый в СУБД механизм, который гарантирует согласованную фиксацию или откат распределенной транзакции на 100%, то пожалуйста приведите его здесь или дайте ссылку. В свою очередь даю ссылки по двухфазной фиксации: вот вот еще ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2009, 17:10 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Aqwerty wrote: > Двухфазная фиксация - как раз не локальный механизм, а механизм > обеспечения работы распределенных транзакций. И поддерживается он не Это локально работающий (только на данном узле, то есть) механизм, используемый распределёнными транзакциями. Конечно же он не может по определению откатить всю распределённую транзакцию. > только в Oracle, а во многих и многих СУБД, т.е. это некий обобщенный > стандарт. X-Open > Если Вы знаете какой-то другой используемый в СУБД механизм, который > гарантирует согласованную фиксацию или откат распределенной транзакции > на 100%, то пожалуйста приведите его здесь или дайте ссылку. Другого и быть не может. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2009, 23:03 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
MasterZiv> Двухфазная фиксация - как раз не локальный механизм, а механизм > обеспечения работы распределенных транзакций. И поддерживается он не Это локально работающий (только на данном узле, то есть) механизм, используемый распределёнными транзакциями. Конечно же он не может по определению откатить всю распределённую транзакцию. > только в Oracle, а во многих и многих СУБД, т.е. это некий обобщенный > стандарт. X-Open Читаем спецификацию : 2.3 Transaction Completion and Recovery TMs and RMs use two-phase commit with presumed rollback, as defined by the referenced OSI DTP specification (model). In Phase 1, the TM asks all RMs to prepare to commit (or prepare) transaction branches. This asks whether the RM can guarantee its ability to commit the transaction branch. An RM may have to query other entities internal to that RM. If an RM can commit its work, it records stably the information it needs to do so, then replies affirmatively. A negative reply reports failure for any reason. After making a negative reply and rolling back its work, the RM can discard any knowledge it has of the transaction branch. In Phase 2, the TM issues all RMs an actual request to commit or roll back the transaction branch, as the case may be. (Before issuing requests to commit, the TM stably records the fact that it decided to commit, as well as a list of all involved RMs.) All RMs commit or roll back changes to shared resources and then return status to the TM. The TM can then discard its knowledge of the global transaction. ... и далее по тексту. Таким образом, X-Open использует все тот же механизм двухфазной фиксации и следовательно имеет все те же его недостатки, а именно если после предварительного подтверждения фиксации транзакции (фаза 1) и до завершения фазы 2 произойдет сбой, то кусок распределенной транзакции на сбойнувшем узле останется в зависшем состоянии. Именно об этом я и говорил. Конечно, если только один узел сбойнул (причем транзакция осталась висеть "неподтвержденной"), а остальные зафиксировали изменения, то достаточно просто закоммитить ее и этот процесс возможно автоматизировать. Но вот что делать, если какие-то узлы зафиксировали, а какие-то откатили транзакцию. Такую ситуацию должен разруливать человек. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2009, 05:09 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
Aqwerty wrote: > Таким образом, X-Open использует все тот же механизм двухфазной фиксации > и следовательно имеет все те же его недостатки, а именно если после > предварительного подтверждения фиксации транзакции (фаза 1) и до > завершения фазы 2 произойдет сбой, то кусок распределенной транзакции на > сбойнувшем узле останется в зависшем состоянии. Именно об этом я и говорил. Ты прочитай, что ещё делает менеджер транзакций. Но вот что делать, если какие-то узлы зафиксировали, а > какие-то откатили транзакцию. Такую ситуацию должен разруливать человек. Эту ситуацию разруливает менеджер транзакций. Он ведёт ещё один лог транзакций и он ответственен за то, чтобы откатить такие транзакции. При этом, на сколько помню (может помню плохо), он может откатить даже уже закоммиченные на каком-то из RM-ов транзакции. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2009, 09:59 |
|
СУБД и фискальный принтер. Как гарантировать целостность данных?
|
|||
---|---|---|---|
#18+
MasterZiv, если мы говорим о СУБД, то откатывать уже зафиксированную транзакцию большинство из них не умеет. В Oracle такая возможность появилась только в 11 версии (последней). а механизм двухфазной фиксации - он архитектурно одинаковый везде и соответственно зависшие транзакции возможны везде, т.к. это допускается архитектурой. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2009, 09:27 |
|
|
start [/forum/topic.php?fid=33&msg=36318089&tid=1548414]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 314ms |
total: | 479ms |
0 / 0 |