View a markdown version of this page

Amazon DocumentDB 中的可重試寫入 - Amazon DocumentDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon DocumentDB 中的可重試寫入

從引擎 8.0.2 版開始,Amazon DocumentDB 支援可重試的寫入。當寫入操作因暫時性網路錯誤或主要選擇而失敗時,驅動程式可以僅自動重試一次操作。Amazon DocumentDB 會刪除重複的重試寫入,以便最多套用一次操作,保留冪等性。

可重試寫入需要支援可重試寫入通訊協定的 MongoDB 相容驅動程式。根據預設,最新的 MongoDB 相容驅動程式會啟用可重試寫入 (retryWrites=true在連線字串中)。如果您要從舊版升級至引擎 8.0.2,您可以從retryWrites=false連線字串中移除 ,以啟用此功能。

要求

若要使用可重試寫入,您必須符合下列要求:

  • Amazon DocumentDB 引擎 8.0.2 版或更新版本。

  • 支援可重試寫入的 MongoDB 相容驅動程式。如需最低版本,請參閱驅動程式的文件。

  • 連線字串必須包含 retryWrites=true,或驅動程式必須預設為可重試寫入 (最新的驅動程式會這麼做)。

受支援的操作

可重試寫入適用於寫入操作,其中每個個別寫入最多會影響一個文件。批次操作符合資格,因為批次中的每個寫入都會分別刪除重複項目。

下列寫入操作是可重試的:

  • insertOne

  • insertMany

  • updateOne

  • deleteOne

  • findOneAndUpdate

  • findOneAndDelete

  • findOneAndReplace

  • bulkWrite (由 insertOne、deleteOne、 updateOne或 replaceOne操作組成時)

對於 insertMany和 bulkWrite,批次中的每個文件都會個別刪除重複項目。如果需要重試,只會插入尚未套用的文件。

注意

commitTransaction 和 abortTransaction 也可以重試,作為交易控制命令,而不是作為寫入。交易內的個別寫入無法重試。如需詳細資訊,請參閱限制。

限制

下列限制適用於 Amazon DocumentDB 中的可重試寫入:

  • updateMany 和 deleteMany 無法重試。

  • 多陳述式交易內的寫入無法重試。交易遞交和中止操作可個別重試。

  • 文件必須包含可重試插入_id的欄位。

  • 可重試寫入僅適用於引擎 8.0.2 版和更新版本。在較早的引擎版本上,在您的連線字串retryWrites=false中設定 以避免錯誤。

  • 使用查詢規劃器 1.0 版的叢集無法重試寫入操作。

  • 對於傳回大型文件的 findOneAndDelete、 findOneAndUpdate和 findOneAndReplace操作,可重試寫入可能會增加寫入延遲,因為完整結果文件會快取進行重複資料刪除。如果寫入效能至關重要,且傳回的文件很大,請考慮retryWrites=false為這些工作負載設定 。

啟用可重試寫入

若要啟用可重試寫入,請在連線字串retryWrites=true中包含 :

mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=true

如果您的驅動程式預設為 retryWrites=true,您可以從retryWrites=false連線字串中移除任何明確的 。

如需完整的連線字串逐步解說,請參閱 以程式設計方式連線至 Amazon DocumentDB。

可重試寫入的運作方式

當您的應用程式使用 傳送寫入時retryWrites=true,驅動程式會將邏輯工作階段 ID (lsid) 和交易編號 (txnNumber) 附加至寫入命令。Amazon DocumentDB 使用這些識別符來刪除重複寫入:

  • 在第一次嘗試時,Amazon DocumentDB 會執行寫入並快取結果。

  • 如果驅動程式重試相同的寫入 (相同 lsid和 txnNumber),Amazon DocumentDB 會傳回快取的結果,而不會重新執行寫入。

  • Amazon DocumentDB 會在原始寫入後 60 分鐘內接受重試。驅動程式會立即重試,因此此時段遠超過驅動程式的需求。

如果重試在原始寫入超過 60 分鐘後抵達,Amazon DocumentDB 就不再有快取結果,並以新的操作執行寫入。

錯誤處理

以下是 Amazon DocumentDB 中可重試寫入的特定錯誤:

錯誤碼 名稱 描述
225 TransactionTooOld 相同工作階段和陳述式的較新交易號碼已遞交,因此此重試太舊而無法套用。
301 不支援可重試寫入 寫入包含可重試的寫入欄位,但引擎版本不支援可重試的寫入,或操作無法重試。連線至早於 8.0.2 的引擎版本retryWrites=false時設定 。

從 retryWrites=false 遷移

如果您要升級至引擎 8.0.2 版,且目前在連線字串retryWrites=false中使用 :

  1. 將您的叢集升級至引擎 8.0.2 版或更新版本。

  2. retryWrites=false 從應用程式的連線字串中移除 ,或將其變更為 retryWrites=true。

  3. 不需要變更應用程式程式碼。驅動程式會自動處理重試。