Prosedur tersimpan, pemicu, dan fungsi yang ditentukan pengguna

BERLAKU UNTUK: SQL API

Azure Cosmos DB menyediakan eksekusi transaksional JavaScript yang terintegrasi dengan bahasa. Saat menggunakan SQL API di Azure Cosmos DB, Anda dapat menulis prosedur tersimpan, pemicu, dan fungsi yang ditentukan pengguna (UDF) dalam bahasa JavaScript. Anda dapat menulis logika Anda di JavaScript yang dieksekusi di dalam mesin database. Anda dapat membuat dan menjalankan pemicu, prosedur tersimpan, dan UDF menggunakan portal Microsoft Azure, API kueri terintegrasi bahasa JavaScript di Azure Cosmos DB, atau SDK klien SQL API Cosmos DB.

Manfaat menggunakan pemrograman sisi server

Menulis prosedur tersimpan, pemicu, dan fungsi yang ditentukan pengguna (UDF) di JavaScript memungkinkan Anda membangun aplikasi berfitur lengkap dan memiliki keuntungan berikut:

  • Logika prosedural: JavaScript sebagai bahasa pemrograman tingkat tinggi yang menyediakan antarmuka yang kaya dan mudah dipahami untuk mengekspresikan logika bisnis. Anda dapat melakukan serangkaian operasi kompleks pada data.

  • Transaksi atomik: Operasi database Azure Cosmos DB yang dilakukan dalam satu prosedur tersimpan atau pemicunya bersifat atomik. Fungsi atomik ini memungkinkan aplikasi menggabungkan operasi terkait ke dalam satu batch sehingga semua operasi dapat berhasil atau tidak berhasil secara bersamaan.

  • Kinerja: Data JSON dipetakan secara intrinsik ke sistem jenis bahasa JavaScript. Pemetaan ini memungkinkan sejumlah pengoptimalan, seperti materialisasi lambat dokumen JSON di kumpulan buffer dan membuatnya tersedia sesuai permintaan untuk kode pelaksana. Ada manfaat kinerja lain yang terkait dengan logika bisnis pengiriman ke database, yang meliputi:

    • Batching: Anda dapat mengelompokkan operasi seperti menyisipkan dan mengirimkannya secara massal. Biaya latensi lalu lintas jaringan dan kelebihan penyimpanan untuk membuat transaksi terpisah berkurang secara signifikan.

    • Prakompilasi: Prosedur tersimpan, pemicu, dan UDF secara implisit telah dikompilasi terlebih dahulu ke format kode byte untuk menghindari biaya kompilasi pada setiap pemanggilan skrip. Karena prakompilasi ini, pemanggilan prosedur tersimpan menjadi lebih cepat dan memiliki jejak rendah.

    • Pengurutan: Terkadang, operasi memerlukan mekanisme pemicu yang dapat melakukan satu pembaruan atau pembaruan tambahan pada data. Selain Atomicity, terdapat juga manfaat kinerja saat melakukan eksekusi di sisi server.

  • Enkapsulasi: Prosedur tersimpan dapat digunakan untuk mengelompokkan logika di satu tempat. Enkapsulasi menambahkan lapisan abstraksi pada data, memungkinkan Anda mengembangkan aplikasi secara terpisah dari data. Lapisan abstraksi ini sangat berguna ketika data tidak memiliki skema dan Anda tidak perlu menambahkan logika tambahan langsung ke aplikasi Anda. Abstraksi memungkinkan Anda melindungi data dengan menyederhanakan akses dari skrip.

Tip

Prosedur tersimpan paling cocok untuk operasi penulisan intensif dan memerlukan transaksi di seluruh nilai kunci partisi. Ketika memutuskan apakah akan menggunakan prosedur tersimpan atau tidak, optimalkan enkapsulasi jumlah maksimum penulisan semaksimal mungkin. Secara umum, prosedur tersimpan bukanlah cara yang paling efisien untuk melakukan operasi baca atau kueri dalam jumlah besar, jadi, menggunakan prosedur tersimpan untuk menggabungkan operasi baca dalam jumlah besar untuk mengembalikannya ke klien tidak akan memberikan manfaat yang diinginkan. Untuk kinerja terbaik, operasi baca intensif ini harus dilakukan di sisi klien menggunakan Cosmos SDK.

Transaksi

Transaksi dalam database biasa dapat didefinisikan sebagai urutan operasi yang dilakukan sebagai satu unit kerja logis. Setiap transaksi memberikan jaminan properti ACID. ACID adalah akronim terkenal yang merupakan singkatan dari:Atomicity, Consistency, Isolation, dan Durability.

  • Atomicity menjamin bahwa semua operasi yang dilakukan di dalam transaksi diperlakukan sebagai satu unit, dan semuanya diterapkan atau tidak sama sekali.

  • Consistency (konsistensi) memastikan bahwa data selalu dalam keadaan valid di seluruh transaksi.

  • Isolation (isolasi) menjamin bahwa tidak ada dua transaksi yang saling mengganggu; sejumlah sistem komersial menyediakan beberapa tingkat isolasi yang dapat digunakan berdasarkan kebutuhan aplikasi.

  • Durability (ketahanan) memastikan bahwa setiap perubahan yang diterapkan dalam database akan selalu ada.

Di Azure Cosmos DB, runtime JavaScript dihosting di dalam mesin database. Oleh karena itu, permintaan yang dibuat dalam prosedur tersimpan dan pemicunya dijalankan dalam lingkup yang sama dengan sesi database. Fitur ini memungkinkan Azure Cosmos DB menjamin properti ACID bagi semua operasi yang merupakan bagian dari prosedur tersimpan atau pemicu. Sebagai contoh, baca artikel cara menerapkan transaksi.

Cakupan transaksi

Prosedur tersimpan dikaitkan dengan kontainer Azure Cosmos dan eksekusi prosedur tersimpan dibatasi pada kunci partisi logis. Prosedur tersimpan harus menyertakan nilai kunci partisi logis selama eksekusi, yang mendefinisikan partisi logis untuk lingkup transaksi. Untuk informasi selengkapnya, baca artikel Partisi Azure Cosmos DB.

Penerapan dan pengembalian

Transaksi diintegrasikan secara default ke dalam model pemrograman JavaScript Azure Cosmos DB. Dalam fungsi JavaScript, semua operasi secara otomatis tercakup dalam satu transaksi. Jika logika JavaScript dalam prosedur tersimpan selesai tanpa pengecualian, semua operasi dalam transaksi diterapkan pada database. Pernyataan seperti BEGIN TRANSACTION dan COMMIT TRANSACTION (dikenal untuk database relasional) bersifat implisit di Azure Cosmos DB. Jika ada pengecualian dari skrip, runtime JavaScript Azure Cosmos DB akan mengembalikan seluruh transaksi. Dengan demikian, menampilkan pengecualian pada dasarnya setara dengan di ROLLBACK TRANSACTION Azure Cosmos DB.

Konsistensi data

Prosedur tersimpan dan pemicu selalu dijalankan pada replika utama kontainer Azure Cosmos. Fitur ini memastikan bahwa operasi baca dari prosedur tersimpan memberikan konsistensi yang kuat. Kueri yang menggunakan fungsi yang ditentukan pengguna dapat dijalankan pada replika utama atau sekunder mana pun. Prosedur tersimpan dan pemicu dimaksudkan untuk mendukung penulisan transaksional; sementara logika baca-saja sebaiknya diterapkan sebagai kueri dan logika sisi aplikasi menggunakan SDK SQL API Azure Cosmos DB, agar Anda dapat memenuhi throughput database.

Tip

Kueri yang dijalankan dalam prosedur tersimpan atau pemicu mungkin tidak melihat perubahan pada item yang dibuat oleh transaksi skrip yang sama. Pernyataan ini berlaku baik untuk kueri SQL, seperti getContent().getCollection.queryDocuments(), serta kueri bahasa terintegrasi, seperti getContext().getCollection().filter().

Eksekusi terikat

Semua operasi Azure Cosmos DB harus diselesaikan dalam durasi waktu tertentu. Prosedur tersimpan memiliki batas waktu 5 detik. Batasan ini berlaku untuk fungsi JavaScript; prosedur tersimpan, pemicu, dan fungsi yang ditentukan pengguna. Jika operasi tidak selesai dalam batas waktu tersebut, transaksi akan dikembalikan.

Anda dapat memastikan fungsi JavaScript selesai dalam batas waktu tersebut atau menerapkan model berbasis kelanjutan untuk menggabungkan/melanjutkan eksekusi. Untuk menyederhanakan pengembangan prosedur tersimpan dan pemicu guna memenuhi batas waktu, semua fungsi pada kontainer Azure Cosmos (misalnya membuat, membaca, memperbarui, dan menghapus item) mengembalikan nilai boolean yang menunjukkan apakah operasi tersebut akan selesai. Jika nilainya false (salah), artinya prosedur harus menyelesaikan eksekusi karena skrip menghabiskan lebih banyak waktu atau throughput yang disediakan dibanding nilai yang dikonfigurasikan. Operasi yang diantrekan sebelum operasi penyimpanan pertama yang tidak diterima dijamin selesai jika prosedur tersimpan dapat selesai tepat waktu dan tidak mengantre permintaan lain. Dengan demikian, operasi harus diantrekan satu per satu menggunakan kaidah callback JavaScript untuk mengelola alur kontrol skrip. Karena skrip dijalankan di lingkungan sisi server, skrip diatur secara ketat. Skrip yang berulang kali melanggar batas eksekusi ditandai tidak aktif dan tidak dapat dieksekusi, dan harus dibuat ulang untuk mematuhi batas eksekusi.

Fungsi JavaScript juga tunduk pada kapasitas throughput yang disediakan. Fungsi JavaScript berpotensi menggunakan sejumlah besar unit permintaan dalam waktu singkat dan mungkin dibatasi lajunya jika batas kapasitas throughput yang disediakan tercapai. Perlu diingat bahwa skrip menggunakan throughput tambahan selain throughput yang dihabiskan untuk menjalankan operasi database, meskipun operasi database ini sedikit lebih murah daripada menjalankan operasi yang sama dari klien.

Pemicu

Azure Cosmos DB mendukung dua jenis pemicu:

Prapemicu

Azure Cosmos DB menyediakan pemicu yang dapat dipanggil dengan melakukan operasi pada item Azure Cosmos. Misalnya, Anda dapat menentukan prapemicu saat membuat item. Dalam hal ini, prapemicu akan berjalan sebelum item dibuat. Prapemicu tidak boleh memiliki parameter input. Jika diperlukan, objek permintaan dapat digunakan untuk memperbarui isi dokumen dari permintaan awal. Saat pemicu terdaftar, pengguna dapat menentukan operasi yang dapat dijalankan dengannya. Jika pemicu dibuat dengan TriggerOperation.Create, artinya penggunaan pemicu dalam operasi penggantian tidak diizinkan. Contohnya, baca artikel Cara menulis pemicu.

Pascapemicu

Sama seperti prapemicu, pascapemicu juga terkait dengan operasi pada item Azure Cosmos dan tidak memerlukan parameter input apa pun. Pascapemicu dijalankan setelah operasi selesai, dan memiliki akses ke pesan respons yang dikirim ke klien. Contohnya, baca artikel Cara menulis pemicu.

Catatan

Pemicu yang terdaftar tidak berjalan secara otomatis ketika operasi yang terkait dengannya (buat/hapus/ganti/perbarui) terjadi. Pemicu harus secara eksplisit dipanggil ketika menjalankan operasi ini. Untuk mempelajari selengkapnya, baca artikel cara menjalankan pemicu.

Fungsi yang ditentukan pengguna

Fungsi yang ditentukan pengguna (UDF) digunakan untuk memperluas sintaksis bahasa kueri SQL API dan menerapkan logika bisnis kustom dengan mudah. Fungsi ini hanya dapat dipanggil dalam kueri. UDF tidak memiliki akses ke objek konteks dan dimaksudkan untuk digunakan sebagai komputasi JavaScript saja. Oleh karena itu, UDF dapat dijalankan pada replika sekunder. Misalnya, baca artikel Cara menulis fungsi yang ditentukan pengguna.

API LINQ JavaScript

Selain mengajukan kueri menggunakan sintaksis kueri SQL API, SDK sisi server memungkinkan Anda melakukan kueri menggunakan antarmuka JavaScript tanpa harus memahami SQL. API kueri JavaScript membantu Anda membuat kueri secara terprogram dengan meneruskan fungsi predikat ke dalam urutan panggilan fungsi. Kueri diurai oleh runtime JavaScript dan dijalankan secara efisien dalam Azure Cosmos DB. Untuk mempelajari tentang dukungan API kueri JavaScript, baca artikel Bekerja dengan API kueri yang terintegrasi dengan bahasa JavaScript. Misalnya, baca artikel Cara menulis prosedur tersimpan dan pemicu menggunakan API Kueri JavaScript.

Langkah berikutnya

Baca artikel berikut untuk mempelajari cara menulis dan menggunakan prosedur tersimpan, pemicu, dan fungsi yang ditentukan pengguna di Azure Cosmos DB:

Mencoba melakukan perencanaan kapasitas untuk migrasi ke Azure Cosmos DB? Anda dapat menggunakan informasi tentang kluster database Anda yang ada saat ini untuk membuat perencanaan kapasitas.