事务和并发修改异常文档不明确



此处的最新文档http://code.google.com/appengine/docs/java/datastore/transactions.html状态:"如果您的应用程序在提交事务时收到异常,并不总是意味着事务失败。在事务已提交并最终将成功应用的情况下,您可以收到DatastoreTimeoutException、ConcurrentModificationException或DatastoreFailureException异常。尽可能使您的数据存储事务幂等,以便如果您重复一个事务,最终结果将是相同的。"

  1. 如何知道交易是否成功
  2. 捕获ConcurrentModificationException后我该怎么办?我如何知道是否必须重试
  3. 例如,在不知道是否成功的情况下,你如何建议将支付交易设为幂等

注意事项:

  1. 正如文档所说,您不能确定是否应用了事务。这是问题的核心。

  2. 如果出现所有异常,只需回滚即可。请参见此示例:http://code.google.com/appengine/docs/java/datastore/transactions.html#Isolation_and_Consistency

  3. 使它幂等——这意味着如果你调用它两次,它就无关紧要了。在支付交易的情况下,您使"支付交易"实体。对于每一笔交易,您都使用支付数据创建一个特殊的实体,并将其写入数据存储。这里的关键是从支付数据中生成一个自然ID:用户ID、源帐户、支付金额、目标帐户、日期/小时/分钟。然后,如果交易重复,它将创建一个具有相同ID的支付交易实体,并覆盖旧的支付交易主体——这意味着如果只完成了一到两笔交易,结果将是相同的。(然后通过一系列交易并将其添加到期初金额中来计算用户账户的余额——这是银行在实践中实际做的AFAIK)。

最新更新