Transactions和ConcurrentModificationException文档含糊不清

http://code.google.com/appengine/docs/java/datastore/transactions.html上的最新文档指出:“如果您的应用在提交交易时收到exception,则并不总是意味着交易失败。您在已提交事务并最终成功应用的情况下,可以接收DatastoreTimeoutException,ConcurrentModificationException或DatastoreFailureExceptionexception。尽可能使数据存储区事务处于幂等状态,以便在重复事务时,最终结果将是相同的。

  1. 如何知道交易是否成功?
  2. 捕获ConcurrentModificationException后我要做什么? 我怎么知道我是否需要重试?
  3. 例如,您如何建议使用幂等的支付交易,而不知道它是否成功?

几点说明:

  1. 正如文档所说 – 你不能确定是否应用了交易。 这是问题的核心。

  2. 只是在所有exception的情况下回滚。 请参阅此示例: http : //code.google.com/appengine/docs/java/datastore/transactions.html#Isolation_and_Consistency

  3. 使它成为幂等的 – 意味着如果你两次调用它,那都没关系。 在支付交易的情况下,您进行“支付交易”实体。 对于每笔交易,您都会使用付款数据创建一个特殊实体并将其写入数据存储区。 此处的关键是从付款数据生成自然ID:用户ID,来源帐户,付款金额,目标帐户,日期/小时/分钟。 然后,如果重复交易,它将创建具有相同ID的支付交易实体,并将覆盖旧的 – 这意味着如果仅完成一个或两个交易,结果将是相同的。 (然后通过一系列交易并将其添加到期初金额来计算用户账户的余额 – 这是银行在实践AFAIK中实际执行的操作)。