Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2010, 09:58   #1
Maks7482
 
Регистрация: 20.08.2010
Сообщений: 6
По умолчанию Точность обработки БД в С++

Нужен совет. Делаю торговую программу, необходимо обработать таблицу с реализацией товара (перенести данные в таблицу с остатками товара). Соответственно очень важен вопрос точности этого процесса и надежности, особенно на случай сбоя оборудования.
На сегодняшний момент есть такой вариант - все изменения в таблице кэшировать, в начале метода поставить bool переменную Maked равную false, а в конце метода, когда все действия выполнены установить в true.
То есть проверкой на истинность Maked завершать метод и только тогда отправлять все изменения в таблицу. Дополнительно использовать еще одну таблицу для контроля, где прописывать дату переноса реализации в остатки и результат переноса, т.е. Maked.
Насколько надежным будет такой метод, а то ведь в случае ошибки последствия могут оказаться очень серьезными.
Maks7482 вне форума Ответить с цитированием
Старый 23.08.2010, 10:37   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

В нормальной СУБД всё это дело реализуется посредством транзакции.
pu4koff вне форума Ответить с цитированием
Старый 23.08.2010, 12:19   #3
Maks7482
 
Регистрация: 20.08.2010
Сообщений: 6
По умолчанию

Читал я про транзакции. Но в моем учебнике даются общие видимо понятия об этом. Среди многих вариантов я выбрал описанный выше. Меня интересует (автор учебника этот момент не уточнил), что будет, если метод, обрабатывающий таблицу и вносящий изменения в другую, закончит свою работу нормально. Переменная проверки этого примет значение ИСТИНА, начнет выполняться команда Upgrate и в этот момент, к примеру, вырубится электричество.
Прошу также учесть, что необходимо будет обрабатывать таблицу в сотни, а возможно и свыше тысячи строк, так что вариант на каждую строку по транзакции не подходит. Небольшое уточнение по алгоритму
Таблица 1 Список действий, которые необходимо выполнить.
код товара количество, которое нужно списать.
количество строк от 1 до 5 000 и более.
Таблица 2 Список результатов вычислений.
код товара количество, которое осталось
количество строк от 50 до 3 000 - 5 000
Суть алгоритма - находится исходная строка за дату в Таблице 1 ищется соответствующий код в Таблице 2 и производится вычитание, в соотв. поле этой строки ставится отметка об обработке этой строки. Переход к следующей строке Таблицы 1 и повтор операции пока в Таблице 1 не закончатся строки. В конце работы накапливается от 1 до 3 000 изменений Таблицы 2 разных строк и от 1 до 5 000 в Таблице 1 по общему количеству обработанных строк. Если метод выполнен производится обновление данных в Таблице 1 и Таблице 2, требуется обеспечить либо полное обновление двух Таблиц, либо никакого с выводом сообщение об ошибке.
До выполнения обновления у меня все продумано, интересует только сам этот процесс, поскольку пройти он должен за две транзакции.
Уже начинаю думать, что проще написать именно такой алгоритм, а в нужный момент отрубить комп от электросети.

P.S. Если что-то выше написанное покажется глупостью прошу меня простить, так как я пишу программу, одновременно читая учебники.
Maks7482 вне форума Ответить с цитированием
Старый 23.08.2010, 13:34   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Транзакция - есть атомарная операция. Всё, что происходит в рамках одной транзакции, либо выполняется целиком, либо не выполняется ничего (происходит откат уже совершенных действий в транзакции). В каждой СУБД этот момент реализуется по разному. Во всех нормальных системах отключение электричества приведёт в итоге к откату незавершенной транзакции.
Ну а уж как транзакции делать - Вам виднее. Можно одну на запись, а можно и заблокировать обе таблицы для других и одну транзакцию на всю эту операцию сделать.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Точность типа float HunterMan Общие вопросы C/C++ 6 07.02.2009 23:05
точность вывода переменной XeN0N Помощь студентам 6 21.01.2009 16:30
Точность Sour Помощь студентам 2 31.05.2007 21:08