預存程序、觸發程序和使用者定義函式
適用於:NoSQL
Azure Cosmos DB 提供 JavaScript 的語言整合式、交易式執行。 在 Azure Cosmos DB 中使用 API for NoSQL 時,您可以使用 JavaScript 語言撰寫預存程序、觸發程序和使用者定義函式 (UDF)。 您可以在 JavaScript 中撰寫邏輯,此邏輯是在資料庫引擎內執行。 您可以使用 Azure 入口網站、Azure Cosmos DB 中的 JavaScript 語言整合式查詢 API 或 Azure Cosmos DB for NoSQL 用戶端 SDK,來建立與執行觸發程序、預存程序及 UDF。
使用伺服器端程式設計的好處
以 JavaScript 撰寫預存程序、觸發程序和使用者定義函數 (UDF),可讓您建置豐富應用程式,其優點如下:
程序邏輯: JavaScript 是一種高階程式設計語言,可提供豐富且熟悉的介面來表達商業規則。 您可以對資料執行一連串的複雜作業。
不可部分完成的交易:可在單一預存程序或觸發程序內執行的 Azure Cosmos DB 資料庫作業為不可部分完成的作業。 這個不可部分完成的功能可讓應用程式將相關作業合併在單一批次中,讓所有作業不是一起成功就是一起失敗。
效能:JSON 資料本身就對應至 JavaScript 語言類型系統。 此對應可提供許多最佳化功能,例如在緩衝集區中對 JSON 文件執行滯後具體化,並讓執行中程式碼可以依需求使用這些文件。 還有其他與將商業規則轉移到資料庫相關的效能優點,包括:
批次處理:您可以分組多個作業 (例如插入),然後大量提交作業。 因此,網路流量延遲成本以及建立個別交易的額外儲存負荷得以大幅降低。
預先編譯: 預存程式、觸發程式和 UDF 會隱含地預先編譯成位元組程式代碼格式,以避免在每次腳本調用時產生編譯成本。 由於預先編譯之故,因此能夠快速叫用預存程序,且只需耗費少量資源。
排序:有時,操作需要一種觸發機制,這類機制可以對資料執行一次或多次更新。 在伺服器端上執行時,除了不可部分完成性外,還會有效能方面的優點。
封裝:預存程序可以用來將邏輯分組在一個位置。 封裝會在資料上方新增抽象層,讓您能夠發展您的應用程式,而不會動到資料。 當資料無結構描述,且您不需要管理直接在應用程式中新增的其他邏輯時,這個抽象層是很有幫助的。 抽象概念可讓您藉由簡化腳本的存取,來保護數據的安全。
提示
預存程式最適合大量寫入的作業,而且需要跨分割區索引鍵值的交易。 當決定是否使用預存程序時,盡可能將最大量的寫入封裝,進而最佳化。 一般而言,預存程序不是執行大量讀取或查詢作業最有效率的方法,因此使用預存程序來批次處理大量要傳回給用戶端的讀取,並不會產生所需的優點。 為了達到最佳效能,您應該使用 Azure Cosmos DB SDK 在用戶端上完成這些大量讀取作業。
注意
伺服器端 JavaScript 功能 (包括預存程序、觸發程序和使用者定義函數) 不支援匯入模組。
交易
一般資料庫中的交易可以定義為以單一工作邏輯單位執行的一連串作業。 每個交易都提供 ACID 屬性保證。 ACID 是一個已知的縮寫,代表四個屬性:不可部分完成性 (Atomicity)、一致性 (Consistency)、隔離性 (Isolation) 及耐用性 (Durability)。
不可部分完成性保證會將交易內完成的所有作業視為單一單位,所有工作不是全部認可就是一個都不認可。
一致性確保資料在交易中一律處於有效的狀態。
隔離 可確保沒有任何兩筆交易彼此干擾 – 許多商業系統提供多個隔離等級,可根據應用程式的需求使用。
耐久性確保資料庫中所認可的任何變更一律會存在。
在 Azure Cosmos DB 中,JavaScript 執行階段會裝載在資料庫引擎中。 因此,在預存程序和觸發程序內提出的要求會與資料庫工作階段相同的範圍中執行。 此功能讓 Azure Cosmos DB 能夠為屬於預存程序或觸發程序一部分的所有作業保證 ACID 屬性。 如需範例,請參閱如何實作交易文章。
提示
針對 Azure Cosmos DB for NoSQL 中的交易支援,您也可以使用慣用的用戶端 SDK 來實作交易式批次。 如需詳細資訊,請參閱 Azure Cosmos DB for NoSQL 中的交易式批次作業。
交易範圍
預存程序與 Azure Cosmos DB 容器相關聯,且預存程序執行的範圍是邏輯分割區索引鍵。 預存程式在執行期間必須包含邏輯分割區索引鍵值,以定義交易範圍的邏輯分割區。 如需詳細資訊,請參閱 Azure Cosmos DB 資料分割文章。
認可和回復
交易原本就整合至 Azure Cosmos DB JavaScript 程式設計模型。 在 JavaScript 函數內,會將所有作業自動包裝在單一交易內。 如果預存程序中儲存的 JavaScript 邏輯完成,而且沒有任何例外狀況,則會將交易內所有的作業認可至資料庫。 如 BEGIN TRANSACTION
與 COMMIT TRANSACTION
(熟悉關聯式資料庫) 等陳述式在 Azure Cosmos DB 中是隱含的。 如果指令碼有任何的例外狀況,則 Azure Cosmos DB JavaScript 執行階段將會復原整個交易。 因此,擲回例外狀況其效力等同於 Azure Cosmos DB 中的 ROLLBACK TRANSACTION
。
資料一致性
預存程序和觸發程序一律會在 Azure Cosmos DB 容器的主要複本上執行。 此功能確保從預存程序讀取的資料有強式一致性。 使用「使用者定義函數」的查詢可以在主要或任何次要複本上執行。 預存程式和觸發程式旨在支援交易式寫入。 同時,只讀邏輯最適合使用適用於 NoSQL SDK 的 Azure Cosmos DB 來實作應用程式端邏輯和查詢,這可協助您飽和資料庫輸送量。
提示
在預存程式或觸發程序內執行的查詢可能不會看到對相同指令碼交易所做之項目的變更。 此陳述式同時適用於 SQL 查詢 (例如 getContent().getCollection().queryDocuments()
),以及整合式語言查詢 (例如 getContext().getCollection().filter()
)。
界限執行
所有 Azure Cosmos DB 作業都必須在指定的逾時期間內完成。 預存程式的逾時限制為 5 秒。 此條件約束適用於 JavaScript 函式 – 預存程式、觸發程式和使用者定義函式。 如果作業未在該時間限制內完成,則會回復交易。
您可以確定 JavaScript 函數會在時限內完成,或實作接續式模型來批次處理/繼續執行。 為了簡化預存程式和觸發程式的開發以處理時間限制,Azure Cosmos DB 容器下的所有函式(例如建立、讀取、更新和刪除專案)會傳回布爾值,代表該作業是否會完成。 如果此值為 false,就表示此程序必須包裝執行,因為指令碼會比設定的值耗用更多時間或佈建的輸送量。 如果預存程式及時完成,而且不會再排入佇列,則第一個未接受存放區作業之前排入佇列的作業保證會完成。 因此,應透過使用 JavaScript 的回撥慣例來管理指令碼的控制流程,一次將一個作業排入佇列。 由於指令碼是在伺服器端環境中執行的,因此受到嚴格控管。 一再違反執行界限的指令碼會標示為非使用中且無法執行,應該將它們重新建立以符合執行界限。
JavaScript 函數也受限於佈建的輸送量容量。 JavaScript 函數可能會在短時間內使用大量要求單位,如果達到佈建的輸送量容量限制,速率便會受到限制。 請務必注意,腳本除了花費在執行資料庫作業的輸送量之外,也會耗用額外的輸送量,不過這些資料庫作業的成本略低於從用戶端執行的相同作業。
觸發程序
Azure Cosmos DB 支援兩種類型的觸發程序:
預先觸發程序
Azure Cosmos DB 提供的觸發程序可透過在 Azure Cosmos DB 項目上執行作業來叫用。 例如,當您正在建立項目時,可以指定預先觸發程序。 在此情況下,在建立項目之前,會先執行預先觸發程序。 預先觸發程序不能有任何輸入參數。 如有必要,要求對象可用來從原始要求更新檔本文。 註冊觸發程序時,使用者可以指定與之搭配執行的作業。 如果觸發程序是使用 TriggerOperation.Create
建立的,這表示將不會允許在取代作業中使用觸發程序。 如需範例,請參閱如何撰寫觸發程序文章。
後續觸發程序
後續觸發程序與預先觸發程序類似,都與 Azure Cosmos DB 項目上的作業相關聯,而且不需要任何輸入參數。 它們是在作業完成之後執行的,而且可以存取傳送給用戶端的回應訊息。 如需範例,請參閱如何撰寫觸發程序文章。
注意
已註冊的觸發程序不會在其對應的作業 (建立/刪除/取代/更新) 發生時自動執行。 您必須在執行這些作業時明確發出呼叫。 若要深入瞭解,請參閱如何執行觸發程序一文。
使用者自訂函數
使用者定義函數 (UDF) 用來擴充 API for NoSQL 查詢語言語法,並輕鬆地實作自訂商務邏輯。 只能在查詢內呼叫它們。 UDF 沒有內容物件的存取權,而且應該用來做為僅限計算的 JavaScript。 因此,UDF 可以在次要複本上執行。
JavaScript Language Integrated Query API
除了使用 API for NoSQL 查詢語法發出查詢外,伺服器端 SDK 還可讓您使用 JavaScript 介面執行查詢,不需具備任何 SQL 的知識。 JavaScript 查詢 API 可讓您以程式設計方式建置查詢,方法是將述詞函式傳遞至函式呼叫序列。 查詢由 JavaScript 執行階段剖析,並透過 Azure Cosmos DB 有效地執行。 若要深入了解 JavaScript 查詢 API 支援,請參閱使用 JavaScript 語言整合式查詢 API 文章。 如需範例,請參閱如何使用 Javascript 查詢 API 寫入預存程序和觸發程序一文。
下一步
透過下列文章了解如何在 Azure Cosmos DB 中撰寫和使用預存程序、觸發程序和使用者定義函數:
正在嘗試為遷移至 Azure Cosmos DB 進行容量規劃嗎? 您可以使用現有資料庫叢集的相關資訊進行容量規劃。
- 如果您知道現有資料庫叢集中的虛擬核心和伺服器數目,請參閱使用虛擬核心或 vCPU 來估計要求單位
- 如果您知道目前資料庫工作負載的一般要求率,請參閱使用 Azure Cosmos DB 容量規劃工具來估計要求單位