分享方式:


使用多個寫入區域時的衝突類型及解決方法原則

適用於:NoSQL MongoDB Cassandra Gremlin 桌子

如果您的 Azure Cosmos DB 帳戶設定了多個寫入區域,就適用衝突和衝突解決原則。

對於已設定多個寫入區域的 Azure Cosmos DB 帳戶,當寫入器同時更新多個區域中的相同項目時,就可能發生更新衝突。 更新衝突有下列三種類型:

  • 插入衝突:當應用程式在兩個以上的區域中,同時插入兩個以上具有相同唯一索引的項目時,就可能發生這類衝突。 例如,ID 屬性就可能發生這種衝突。

  • 取代衝突:當應用程式在兩個以上的區域中同時更新相同項目時,就可能發生這類衝突。

  • 刪除衝突:當應用程式在刪除某區域中一個項目的同時,又在其他區域更新這個項目,就可能會發生這類衝突。

衝突解決原則

Azure Cosmos DB 提供彈性的原則導向機制來解決寫入衝突。 您可以在 Azure Cosmos DB 容器上選取下列兩個衝突解決原則:

  • 最後寫入者為準 (LWW):此解決原則預設會使用系統定義的時間戳記屬性。 它是以時間同步化時鐘通訊協定為基礎。 如果您使用 API for NoSQL,就可以指定使用任何其他自訂數值屬性 (例如您自己的時間戳記標記法) 來解決衝突。 自訂數值屬性也稱為「衝突解決路徑」

    如果兩個或更多項目在插入或取代作業時發生衝突,則包含衝突解決路徑最高值的項目會成為「優先」項目。 如果多個項目的衝突解決路徑值都相同,則由系統決定「優先」項目。 所有區域都會彙整出單一優先項目,且認可項目的版本最後都會相同。 如果涉及刪除衝突,則刪除的版本一律優先於插入或取代衝突。 無論衝突解決路徑的值為何,都會出現此結果。

    注意

    「最後寫入者為準」是預設的衝突解決原則,而且會對下列 API 使用 _ts 時間戳記:SQL、MongoDB、Cassandra、Gremlin 和 Table。 自訂數值屬性僅適用於 API for NoSQL。

    若要深入了解,請參閱使用 LWW 衝突解決原則的範例

  • 自訂:此解決原則適用於應用程式定義的衝突調整語意。 當您在 Azure Cosmos DB 容器上設定此原則時,您也需要註冊合併預存程序。 在伺服器的資料庫交易下偵測到衝突時,系統會自動叫用此程序。 系統只針對合併程序的執行提供一次保證 (為認可通訊協定的一部分)。

    如果您使用自訂解決選項來設定容器,卻無法在容器上註冊合併程序,或合併程序在執行階段擲回例外狀況,則衝突會寫入「衝突摘要」。 然後您的應用程式需要手動解決衝突摘要中的衝突。 若要深入了解,請參閱如何使用自訂解決原則及如何使用衝突摘要的範例

    注意

    自訂衝突解決原則僅適用於 API for NoSQL 帳戶,而且只能在建立時設定。 您無法在現有的容器上設定自訂解決原則。

下一步

了解如何設定衝突解決原則: