[英]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.