我正在向数据库提交事务。如果客户端在事务期间丢失 wifi 连接,但在提交后它不会知道事务已完成。问题在于,如果移动应用程序同意并且服务器知道 1) 移动应用程序已同意并且 2) 移动应用程序知道事务已完成,则服务器应该只永久提交事务。解决方案似乎是让移动应用程序发送确认交易的确认消息,但是如果在服务器收到确认之后但在服务器发回 200 之前发生断开连接问题怎么办?现在服务器认为移动应用程序知道,但移动应用程序不确定服务器是否收到此消息。这几乎看起来像是某种类型的握手,因为双方都必须知道每一方的内容。问题是如何在不可靠的网络中处理事务,其中服务器需要知道客户端既接受了事务又知道事务已经完成,然后才使事务永久化。
最佳答案
这是 Two General's Problem ,因此无法解决。确认的确认只是另一个要确认的消息,因此在有限的时间来回中,您永远无法完全确认原始消息已发送并且双方都肯定知道。
在实际生活中,你将不得不选择你接受什么样的风险。对于像 friend 同意见面这样的低风险消息,一个确认回复通常足以让他们继续进行,尽管回复可能从未真正通过。现在考虑通过基于 GPRS 的 EDC 进行支付。总是有可能连接在完全交付付款指令后立即断开,并且在客户决定离开之前没有恢复。如果没有打印确认收据,商店通常会将付款视为从未完成,仅在稍后恢复交易。商店和客户都接受这种风险。
"Your Coffee Shop Doesn’t Use Two-Phase Commit"在设计系统时,post 是一本非常好的读物。考虑要求。回滚 Not Acceptable 吗?是否存在一定程度的可以容忍甚至预期的不一致?也许您甚至可以减少客户端的角色,只尝试发送命令,然后从服务器回读,丢弃它自己的。
关于android - 如何在交易过程中保持手机和服务器同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61263776/