很长一段时间以来,这个问题一直困扰着我。
数据库:Amazon DynamoDB
表:MasterRegistrationTable(A)和RegistrationType1Table(B)
场景:我们有一个网络服务。用户发送数据调用我们服务的某些ReST API。现在我们需要进行PUT / UPDATE操作。现在抓住了。我们需要首先在表B中执行该操作,并且由于我们有一个聚合来自所有从站的数据的主表,我们必须在A中执行相同的操作。我们如何确保数据是 1.不会丢失 2.输入两者或无人。
可能存在各种失败点
场景1:表B更新,对表A的更新失败。
场景2:我们从表B记录preImage。对表B进行更新。然后尝试更新表A但它失败了。所以我们回滚到preImage,但是回滚步骤失败了(顺便说一下,回滚也是DELETE操作)
场景3:我们在/ start / end之间引入一个Queue。在它们之间引入队列不会保证DB的一致状态,因为数据可能在队列中完整但只有一个DB(B)被更新而另一个没有。对A的任何查询都不会返回结果。如果操作失败,数据被推送到队列也会引入将数据推送到队列的事实也会失败。
我想你明白了。
我想知道在NoSQL世界中如何处理事务。这样的设计是不是很糟糕?我们是否应该永远不会有更新两个数据库的情况?如果我们有一个怎么办?当系统出现故障(应用程序故障,网络中断等)时,如何保证系统不处于不一致状态?