我们正在开发一个 RetailPOS .net (windows) 应用程序。
一位客户问“突然断电时,应用程序中正在处理的当前数据会发生什么?”,“应用程序能否恢复未保存的数据?”
我想知道,如何将这个功能包含在 .net 应用程序中?
有人可以帮助我,为此需要做些什么?
首先,查看 UPS(不可中断电源)
其次,考虑创建持久事务,这些事务将尽早且经常保存,但在您告诉它之前不会提交。这一点超出了 TSQL 中的典型事务。
如果是硬断电(比如笔记本电脑上的电池在拔掉电源时拔掉了),那么除了每次都写入磁盘之外,您无能为力。步。的。这。方式。(谈论性能损失。)并且还要确保您记录了一些内容,以让应用程序知道它何时启动备份它之前正在执行的操作,以便它可以继续或重试操作。
如果是断电,例如按下电源按钮以关闭/睡眠/休眠计算机,则侦听 SystemEvents.PowerModeChanged 事件并采取相应措施。
最后,确保如果您的数据在中途写入数据库时会损坏,请确保您的数据库写入是原子的(所有更改都发生并被接受,或者它们都不被接受)。
您可以将当前接收到的信息附加到文件系统中。这将影响性能,但可以让您回到最后一个被捕获的项目。
当应用程序启动时检测是否有挂起的文件,并提供恢复选项。适当地加载保存在文件中的数据。
一旦您掌握了所有信息,当您执行付款时发生的流程时,请确保以原子方式记录流程中的任何重大更改。如果您正在访问外部系统,请记录您启动操作的时间以及它立即返回的时间。在上述情况下,总有一个时间窗口可能会失败,但您希望将其保持尽可能短,并为恢复过程提供足够的信息。最坏的情况是,如果系统无法自动恢复,您希望它有足够的信息来确定它在进程中停止的位置。
PowerFailureException 类将解决这个问题。实际上只是用UPS维持电源。唯一的其他选择实际上是维护数据库事务的原子性。
您真正想要的是磁盘事务的原子性。有很多方法可以执行这些操作,但通常如果您使用现有的数据库产品,它会为您完成。
如果您推出自己的数据库或文件格式,您可以根据您的文件格式为您完成一些工作。