Java 如何找出Firestore中事务失败的根本原因?

Java 如何找出Firestore中事务失败的根本原因?,java,firebase,google-cloud-firestore,Java,Firebase,Google Cloud Firestore,如果Firestore事务失败,它将抛出FirestoreException,该异常仅表示“由于重试次数过多,事务被取消。” 即使我将退休人数设置为1,也没有根本原因或任何其他线索 有可能找到根本原因吗?如果允许编辑,您应该检查firebase控制台firestore规则。。。创建新的编辑权限 service cloud.firestore { match /databases/{database}/documents { // Anyone can read a p

如果Firestore事务失败,它将抛出
FirestoreException
,该异常仅表示“由于重试次数过多,事务被取消。”

即使我将退休人数设置为1,也没有根本原因或任何其他线索


有可能找到根本原因吗?

如果允许编辑,您应该检查firebase控制台firestore规则。。。创建新的编辑权限

service cloud.firestore {  
    match /databases/{database}/documents {
        // Anyone can read a product, only authorized
        // users can create or update. Deletes are not allowed.
        match /products/{productId} {
            allow read: if true;
            allow create, update: if request.auth.uid != null;
        }
    }
}
根据a,显示消息“由于重试次数过多,交易被取消”。只能在
private void runTransactionAttempt
下找到:

 private void maybeRetry() {
            if (attemptsRemaining > 0) {
              span.addAnnotation("retrying");
              runTransactionAttempt(
                  transactionCallback,
                  resultFuture,
                  new TransactionOptions(
                      attemptsRemaining, options.getExecutor(), transaction.getTransactionId()),
                  span);
            } else {
              span.setStatus(TOO_MANY_RETRIES_STATUS);
              rejectTransaction(
                  FirestoreException.serverRejected(
                      Status.ABORTED, "Transaction was cancelled because of too many retries."));
            }
          }
如您所见,在尝试运行事务和/或批处理写入时,您会遇到重复的异常。查看后,您可以看到交易失败的三个主要原因:

1。事务在写入操作之后包含读取操作。阅读 操作必须始终位于任何写入操作之前

2.事务读取的文档在外部被修改 交易在这种情况下,事务将自动再次运行

3。事务重试次数有限。交易 超过最大请求大小10 MiB。 事务大小取决于文档和索引项的大小 由事务修改。对于删除操作,这包括 目标文档的大小和删除的索引项的大小 作为对这次行动的回应

要调试此问题,我强烈建议您使用以下来源进行深入阅读——如果没有您的部件中的代码片段,很难帮助您实现解决方案:


这通常是因为您试图修改的数据在事务运行时被其他客户端/进程修改。如果发生这种情况,Firestore客户端将重试该事务。但如果反复发生,它就会放弃。除此之外,无法获取更多信息。Firestore无法设置事务的重试次数。在这种情况下,您实际设置了什么?@DougStevenson确实设置了,至少在Java Admin SDK中是这样。谢谢您的评论。抱歉,如果我不清楚的话,我不是想调试一个特定的案例,而是希望能够通过编程确定根本原因(至少是最明显的原因,例如文档太大)。Frank指出,所有处理相同文档的客户端的并行度是罪魁祸首。如果不了解您正在执行的实际事务以及并行级别,就没有什么可说的了。有没有办法记录GRPC ApiException?也许那里的状态代码有助于缩小实际问题的范围。@Andrew你是指一般问题还是在OP的情况下?@Andrew One只能捕获抛出的内容(或设置断点)。@MartinZeitler正确-但在原始问题的情况下,实际上是由于延长了上载限制(正如他自己所提到的)这就是为什么我特别问,但谢谢你的回答!