此处http://code.google.com/appengine/docs/java/datastore/transactions.html的最新文档指出: “如果您的应用在提交事务时收到异常,则并不总是意味着事务失败。在事务已提交并最终成功应用的情况下,您可以收到DatastoreTimeoutException,ConcurrentModificationException或DatastoreFailureException异常。尽可能使用您的数据存储区事务是幂等的,这样如果您重复一个事务,最终结果将是相同的。“
答案 0 :(得分:1)
很少注意到:
正如文档所说 - 您无法确定是否已应用交易。这是问题的核心。
如果遇到所有异常,只需回滚。请参阅此示例:http://code.google.com/appengine/docs/java/datastore/transactions.html#Isolation_and_Consistency
让它成为幂等的 - 意思是如果你两次调用它,那没关系。在支付交易的情况下,您进行“支付交易”实体。对于每笔交易,您都会创建一个包含付款数据的特殊实体,并将其写入数据存储区。此处的关键是从付款数据生成自然ID:用户ID,来源帐户,付款金额,目标帐户,日期/小时/分钟。然后,如果重复交易,它将创建具有相同ID的支付交易实体,并将覆盖旧的 - 这意味着如果仅完成一个或两个交易,结果将是相同的。 (然后通过一系列交易计算用户账户的余额并将其添加到期初金额 - 这就是银行在实践AFAIK中实际做的事情。)