【问题标题】:Perfect data integrity possible with database transactions that correspond to real world events?与现实世界事件相对应的数据库事务可以实现完美的数据完整性?
【发布时间】:2011-07-04 22:15:35
【问题描述】:

我正在和一个人交谈,他在 ATM 崩溃时正在使用它(显然它运行的是 Windows XP)并拿走了他的钱。

具有预写日志记录的事务性数据库可以确保您的数据库保持一致的状态,即使 ATM 崩溃(即您将始终知道 ATM 中应该和客户的帐户)。然而,出金不仅仅是数据库事务,也不是即时操作,那么您应该在出金之前还是之后提交交易呢?在这两种情况下,如果 ATM 在正确的时间崩溃,银行或客户都有可能蒙受损失。

是否有任何完美(或至少相当完美)的解决方案来解决这个问题?

我能想到的一种方法是 ATM 是否能够计算其中的金额。如果 ATM 先进行交易,然后分发现金,那么在从崩溃中恢复时,ATM 可以立即分发超出根据保证一致数据库应包含的任何额外的钱。

但从硬件的角度来看,我不知道这是否真的可行。

你怎么看?有没有其他方法可以解决这个问题?

【问题讨论】:

  • 我曾经忘记在一家大型橙色超市外的 ATM 取款。我被告知,在几秒钟后(30 秒?),任何未取走的已分发现金都将被收回并存储在机器内,但要与等待分发的现金分开。我的银行告诉我联系商店,看看机器里是否有现金等待领取。不用说没有,我损失了 40 英镑(哎哟!)

标签: sql database transactions acid


【解决方案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 ...

您可以设计更多的状态来描述困难的崩溃情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多