Откат событий

Romantik

TeaM PHPClub
Откат событий

Приветствую.
Вот возникла идея сделать откат событий.
Поясняю: Есть программа сладского учета.
Идея одного из модулей состоит в том, что
при добавлениии события (расход, приход) задействуется несколько событий в транзакции (INSERT для добавления накладной и UPDATE для изменения баланса клиентов).
Есть редактирование, но вот теперь захотелось сделать откат.

Честно, я не представляю как это лучше сделать...
Как вариант алгоритм: Записывать в БАЗУ все INSERT и UPDATE как есть (т.е. в ячейке будет: UPDATE balance SET sum=sum-100 WHERE id=2)!
Далее если я захочу удалить накладную, то используя данные из таблицы отката я должен удалить(вернуть) количество на склад и добавить(отнять) сумму по балансу клиента.
(соответственно вместо INSERT будет DELETE, а вместо UPDATE c +, будет UPDATE с - )

Есть ли еще варианты или идеи?
Есть ли еще алгоритмы.

Заранее благодарен за любую информацию.
 

Romantik

TeaM PHPClub
Да, я использую InnoDB и ROLLBACK когда заношу данные в базу (много INSERTов и UPDATE)

Но вот через время я, делая сверку или анализ, хочу удалить какую-то накладную.

-~{}~ 20.02.04 12:12:

Пример события:

Накладная приход # 22 от 20-02-2004 Фирма "Рога и Сын" Сумма 300.00
1. MB i845PE 2 по 50.00
2. CPU P4 2000 2 по 100.00

таблицы:
ord
id num id_client date sum
3 #22 11 2004-02-20 300.00

ord_ext
id ind id_wares qty price
1 3 112 2 50.00
2 3 221 2 100.00

balance
UPDATE balance SET sum=sum+300.00 WHERE id_client= 11

wares
UPDATE wares SET qty=qty+2 WHERE id_wares= 112
UPDATE wares SET qty=qty+2 WHERE id_wares= 221


итого в транзакции 3 INSERT и 3 UPDATE

Я думал все эти запросы писать строкой в базу и потом если через время надо удалить, то я делаю 3 DELETE и 3 UPDATE c минусом.
tony2001 предлагает отслеживать все события, зная ТОЛЬКО ord.id и делать обратные операции...
Спасибо большое- действительно проще.

Может кто-то делал подобный алгоритм, поделитесь опытом.
 

Zaval

Новичок
Romantik я все операции и откаты в т.ч. делаю по твоему-же совету. Для примера:
table tovar_giving

giving_id giving_date firma_id worker_id tovar_id giving_kolvo giving_kolback giving_koloff giving_cena giving_back (enum('Y','N')) giving_item user_id

Из всего нам интересны 4 поля:
giving_kolvo giving_kolback giving_koloff giving_back

Проведем операцию: выдача товра продавцу.
3 шт
при этом в giving_kolvo и giving_koloff пишем 3 и 3

При продаже 1 шт делаем update giving_koloff-1 (упрощенно)
При возврате на склад 1 шт делаем update giving_kolback=1 (упрощенно).
При возврате с продажи делаю такую-же операцию, как при выдаче, но в giving_back пишем 'Y' (Чтобы пометить, что это возврат).

При таком построении, никогда не теряется инфа по движению. И с откатами порядок.
 

Crazy

Developer
Автор оригинала: Romantik
Но вот через время я, делая сверку или анализ, хочу удалить какую-то накладную.
Это уже не откат события, а вполне конкретная бизнес-операция "отмена накладной". И она вовсе не всегда ("как правило не") воспровождается выполнением операции DELETE.

К PHP или БД эта проблема отношения вообще не имеет: это проблема формирования документооборота. Аналогичная ситуация: имеем журнал регистрации входящей коррекспонденции (обычный, бумажный) и хотим убрать из него письмо недельной давности, обнаружив, что мы зарегистрировали его дважды.
 
Сверху