Возможна ли идеальная целостность данных с транзакциями базы данных, соответствующими реальным событиям?

Я разговаривал с парнем, который пользовался банкоматом, когда он сломался (очевидно, он работал под управлением Windows XP) и забрал свои деньги.

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

Существуют ли идеальные (или, по крайней мере, достаточно совершенные) решения этой проблемы?

Один из способов, которым я могу думать, - это если бы банкомат имел возможность подсчитывать сумму денег в нем. Если банкомат сначала зафиксировал транзакцию, а затем выдал наличные, то после восстановления после сбоя банкомат мог бы немедленно выдать любые дополнительные деньги сверх того, что он должен содержать в соответствии с гарантированно непротиворечивой базой данных.

Но с аппаратной точки зрения я не знаю, будет ли это действительно возможно.

Что вы думаете? Есть ли другие способы справиться с этой проблемой?


person nw.    schedule 04.07.2011    source источник
comment
Однажды я забыл взять наличные в банкомате возле большого супермаркета оранжевого цвета. Мне сообщили, что через несколько секунд (30?) любая выданная наличность, которая не была взята, втягивается и сохраняется в автомате, но отдельно от наличных, ожидающих выдачи. В моем банке мне сказали связаться с магазином, чтобы узнать, есть ли наличные деньги в автомате, ожидающие получения. Излишне говорить, что этого не было, и я потерял 40 фунтов стерлингов (ой!)   -  person onedaywhen    schedule 05.07.2011


Ответы (1)


Если внутри транзакции есть активность за пределами системы базы данных, использование столбца «статус» для построения «транзакции вручную» является решением для такой ситуации.

например: Статус выдачи кэша:

0 - Check the account of user
1 - Check passed, dispensing cache
2 - Dispense cache sucessfully
-1 - Updated status after reboot the ATM from crash if the status is 1
-2 - Updated status after reboot the ATM for other erratic situations ...

Вы можете создать больше статусов, чтобы описать сложную аварийную ситуацию.

person Mike Lue    schedule 05.07.2011