I had been speaking to some guy who had been utilizing an ATM if this crashed (it had been running Home windows XP, apparently) and required his money.

A transactional database with write-ahead logging can make sure that your database remains inside a consistent condition, even when the ATM crashes (i.e. you'll always know how much cash should maintain the ATM as well as in the customer's account). Meting out cash, however, isn't just a DB transaction and isn't an immediate operation, so in the event you commit the transaction before or following the money is distributed? In the two cases, it's possible for either the financial institution or even the customer to get rid of money when the ATM crashes in the proper time.

What are the perfect (or at best reasonably perfect) methods to this issue?

One of the ways I'm able to think is that if the ATM had the capacity to count how much money inside it. When the ATM committed the transaction first after which distributed the money, then upon recuperating from the crash, the ATM could immediately dispense any extra money above what it really should contain based on the guaranteed consistent database.

But from the hardware perspective I'm not sure in the event that would actually be achievable.

What is your opinion? Are there more ways to cope with this problem?

If there's a task outdoors the database system inside a transaction, using "status" column to construct a "manual transaction" is really a solution for such situation.

for instance: Dispense Cache Status:

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 ...

You might design more status to explain the difficult crash situation.