如果事务失败并且由于其他原因导致应用程序崩溃并且未回滚该事务怎么办?
此外,会发生什么情况,应该如何处理rollback
个失败?
答案 0 :(得分:1)
您不必担心应用程序崩溃对事务回滚(或任何其他有状态数据存储操作)的影响。
该应用程序仅发送用于操作的RPC请求。实际的操作步骤/序列执行发生在数据存储后端,而不是应用程序内部。
From Life of a Datastore Write:
我们将在放置新数据方面更详细一些 在数据存储区中作为写入操作(例如插入)的一部分, 删除,更新和交易。重点是后端工作 这是所有运行时所共有的。
...
当我们呼叫
put
或makePersistent
时,发生了几件事 通话返回前的场景并设置实体的键:
my_todo
对象将转换为protocol buffer。- appserver对数据存储服务器进行RPC调用,将实体数据发送到协议缓冲区中。
- 如果未提供密钥名称,则将为此实体的密钥确定唯一的ID。实体密钥由
app ID | ancestor keys | kind name | key name or ID
组成。- 数据存储服务器按两个阶段处理请求的顺序:提交,然后应用。在每个阶段,数据存储 服务器标识应该接收的Bigtable个平板电脑服务器 数据。
现在,根据您使用的客户端库,事务回滚可以是完全自动的(例如,在ndb
python客户端库中),也可以由您的应用负责。但是,即使这是您的应用程序的责任,无论如何,这都是尽力而为的尝试。如果不请求回滚而崩溃,则仅意味着后端上某些潜在的挂起操作最终将超时,而不是主动结束。另请参阅相关的GAE: How to rollback a transaction?