簡體   English   中英

如何找出 Firestore 中事務失敗的根本原因?

[英]How to find out root cause of transaction failure in Firestore?

如果 Firestore 事務失敗,它會拋出FirestoreException ,它只會說“由於重試次數太多,事務被取消”。

沒有根本原因或任何其他線索,即使我將退休人數設置為 1。

是否有可能找到根本原因?

根據文檔,帶有消息“事務因重試次數過多而被取消。 ”的FirestoreException只能在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."));
            }
          }

如您所見 - 在嘗試運行事務和/或批量寫入時,您遇到了重復的異常。 查看Firebase 文檔后,您可以看到事務可能失敗的三個主要原因:

1.事務包含寫操作后的讀操作。 讀操作必須始終在任何寫操作之前。

2.事務讀取了在事務之外修改的文檔。 在這種情況下,事務會自動再次運行。

3.事務被重試有限次數。 事務超過了 10 MiB 的最大請求大小。 事務大小取決於事務修改的文檔和索引條目的大小。 對於刪除操作,這包括目標文檔的大小和響應該操作刪除的索引條目的大小。

為了調試問題,我強烈建議閱讀以下來源以供進一步閱讀-如果沒有您的代碼片段,則很難幫助您實現解決方案:

您應該檢查您的 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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM