共用方式為


預存程序、觸發程序和使用者定義函式

Azure Cosmos DB 提供語言整合的 JavaScript 交易執行。 在 Azure Cosmos DB 中使用 NoSQL API 時,你可以用 JavaScript 語言撰寫儲存程序觸發器和使用者自訂函式(UDF)。 你可以用 JavaScript 來撰寫邏輯,並在資料庫引擎中執行。 你可以透過 Azure 入口網站、Azure Cosmos DB 中的 JavaScript 語言整合查詢 APIAzure Cosmos DB for NoSQL 用戶端 SDK 來建立並執行觸發器、儲存程序和 UDF。

使用伺服器端程式設計的優點

用 JavaScript 撰寫儲存程序、觸發器和使用者定義函式(UDF)可以讓你打造豐富的應用程式,並具備以下優點:

  • 程序邏輯: JavaScript 是一種高階程式語言,提供豐富且熟悉的介面來表達商業邏輯。 你可以對資料執行一連串複雜的操作。

  • 原子交易: Azure Cosmos DB 資料庫操作若在單一儲存程序或觸發器內執行,則是原子式的。 這個原子性功能讓應用程式能將相關操作合併成一個批次,確保所有操作要麼全部成功,要麼全數失敗。

  • 效能: JSON 資料本質上與 JavaScript 的類別系統相映射。 這種映射允許多項優化,例如在緩衝池中延遲實體化 JSON 文件,並讓這些文件可以按需提供給執行中的程式碼。 將業務邏輯轉移到資料庫還有其他效能上的好處,包括:

    • 批次處理: 你可以將插入等操作群組起來,整批提交。 網路流量延遲成本及建立獨立交易所需的儲存開銷大幅降低。

    • 編譯前: 儲存程序、觸發器與 UDF 會隱含地預先編譯為位元組碼格式,以避免每次腳本呼叫時的編譯成本。 由於預編譯,儲存程序的呼叫速度快速且佔用空間低。

    • 序列有時操作需要觸發機制,可能對資料進行一次或額外的更新。 除了原子性,在伺服器端執行時也具有效能上的提升。

  • 封裝: 儲存程序可以用來將邏輯集中於一處。 封裝在資料之上加入抽象層,讓你能獨立於資料而演進應用程式。 當資料是無結構的,且不必直接在應用程式中加入額外邏輯時,這層抽象非常有幫助。 抽象化讓你透過簡化腳本的存取方式,來保護資料的安全。

小提示

儲存程序最適合用於寫入密集且需要跨區鍵值交易的操作。 在決定是否使用儲存程序時,應優化以封裝最大寫入次數為目標。 一般來說,儲存程序並不是執行大量讀取或查詢操作的最有效率方式,因此使用儲存程序批次大量讀取回傳給客戶端,無法帶來預期的效益。 為了達到最佳效能,這些讀取密集的操作應在用戶端使用 Azure Cosmos DB SDK 進行。

不建議使用強一致性的儲存程序,因為突變是局部的。

備註

伺服器端的 JavaScript 功能,包括儲存程序、觸發器及使用者自訂函式,不支援匯入模組。

Transactions

典型資料庫中的交易可定義為一連串操作,作為單一邏輯工作單元執行。 每筆交易都提供 ACID 性質的保證。 zh-TW: 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 資料庫容器相關聯,且儲存程序執行範圍為邏輯分割區鍵。 預存程序在執行時必須包含一個邏輯分割鍵值,以確定交易範圍的邏輯分割。 欲了解更多資訊,請參閱 Azure Cosmos DB 分割 文章。

提交與回滾

交易已原生整合於 Azure Cosmos DB JavaScript 程式設計模型中。 在 JavaScript 函式中,所有操作會自動包裹在單一交易中。 如果儲存程序中的 JavaScript 邏輯在沒有任何例外的情況下完成,則該交易中的所有操作都會被提交到資料庫。 像 BEGIN TRANSACTIONCOMMIT TRANSACTION 這類(關聯式資料庫常見的)陳述在 Azure Cosmos DB 中是隱含的。 如果腳本有任何例外情況,Azure Cosmos DB JavaScript 執行環境會回滾整筆交易。 因此,拋出例外在 Azure Cosmos 資料庫中實際上等同於 a ROLLBACK TRANSACTION

資料一致性

儲存程序與觸發器總是在 Azure Cosmos 資料庫容器的主要副本上執行。 此功能確保從儲存程序讀取時能提供 強一致性。 使用使用者自訂函式的查詢可以在主副本或任何次要副本上執行。 儲存程序與觸發器旨在支援交易寫入。 同時,唯讀邏輯最好在應用程式端透過 Azure Cosmos DB for NoSQL SDKs 來實作查詢,這有助於達到資料庫的吞吐量飽和。

小提示

在儲存程序或觸發器中執行的查詢,可能看不到同一腳本交易對項目的變更。 此陳述同時適用於 SQL 查詢,如 getContent().getCollection().queryDocuments(),也適用於整合語言查詢,如 getContext().getCollection().filter()

有界執行

所有 Azure Cosmos 資料庫操作必須在指定的逾時時間內完成。 儲存程序的逾時限制為 5 秒。 此限制適用於 JavaScript 函式——儲存程序、觸發器及使用者自訂函式。 若該操作未能在指定時間內完成,則交易將被回復。

你可以確保 JavaScript 函式在時間限制內完成,或實作基於延續的批次/續執行模型。 為了簡化儲存程序與觸發器以處理時間限制的開發,Azure Cosmos 資料庫容器下的所有函式(例如建立、讀取、更新和刪除項目)都會回傳一個布林值,代表該操作是否會完成。 如果這個值為假,表示程序必須結束執行,因為腳本消耗的時間或已配置的吞吐量超過設定值。 在第一個未被接受的儲存操作之前排隊的操作,只要儲存程序能及時完成且不再排隊請求,則保證會完成。 因此,操作應依 JavaScript 的回調慣例逐一排隊,管理腳本的控制流程。 因為腳本是在伺服器端執行的,所以受到嚴格的治理。 反覆違反執行邊界的腳本可能會被標記為非活動且無法執行,且應重新建立以遵守執行邊界。

JavaScript 函式也會受到 已配置的吞吐量限制。 JavaScript 函式可能在短時間內使用大量請求單元,且若達到預定的吞吐量上限,可能會受到速率限制。 值得注意的是,腳本除了執行資料庫操作所消耗的吞吐量外,還會消耗額外的吞吐量,儘管這些資料庫操作的成本略低於用戶端執行的相同操作。

觸發器

Azure Cosmos DB 支援兩種觸發器:

預觸發器

Azure Cosmos DB 提供觸發器,可透過對 Azure Cosmos 資料庫項目執行操作來呼叫。 例如,你可以在建立物件時指定一個預觸發器。 在這種情況下,預觸發會在項目建立前執行。 預觸發器不能有任何輸入參數。 如有需要,請求物件可用來更新原始請求的文件主體。 當觸發器被註冊時,使用者可以指定可執行的操作。 如果觸發器是用 TriggerOperation.Create 創建的,這意味著不允許在替換操作中使用該觸發器。 範例請參見 「如何撰寫觸發器 」文章。

後觸發

類似於預觸發,後觸發也與 Azure Cosmos 資料庫項目相關的操作相關聯,且不需要任何輸入參數。 它們 會在 操作完成後執行,並能存取發送給用戶端的回應訊息。 範例請參見 「如何撰寫觸發器 」文章。

備註

註冊觸發器在其對應操作(建立/刪除/替換/更新)發生時不會自動執行。 執行這些操作時必須明確呼叫它們。 想了解更多,請參閱 如何執行觸發器 文章。

用戶定義函式

使用者自訂函式(UDF)用於擴充 NoSQL 查詢語言語法的 API,並輕鬆實作自訂商業邏輯。 它們只能在查詢中被呼叫。 UDF 無法存取上下文物件,設計上是作為純運算的 JavaScript。 因此,UDF 可以在次要副本上執行。

JavaScript 語言內嵌查詢 API

除了使用 API 進行 NoSQL 查詢語法外, 伺服器端 SDK 還允許您在不懂 SQL 的情況下,使用 JavaScript 介面執行查詢。 JavaScript 查詢 API 允許你透過將謂詞函式傳遞到一連串函式呼叫中,程式化地建立查詢。 查詢由 JavaScript 執行時解析,並在 Azure Cosmos 資料庫中高效執行。 欲了解 JavaScript 查詢 API 支援,請參閱 「與 JavaScript 語言整合查詢 API 合作 」文章。 範例請參見 「如何使用 JavaScript 查詢 API 撰寫儲存程序與觸發器 」文章。

後續步驟

請參考以下文章,學習如何在 Azure Cosmos DB 中撰寫與使用儲存程序、觸發器及使用者自訂函式:

正在嘗試為遷移至 Azure Cosmos DB 進行容量規劃嗎? 您可以使用現有資料庫叢集的相關資訊進行容量規劃。