Bagikan melalui


Transaksi dan kontrol konkurensi optimis

BERLAKU UNTUK: NoSQL

Transaksi database menyediakan model pemrograman yang aman dan dapat diprediksi untuk menghadapi perubahan bersamaan pada data. Database relasional tradisional, seperti SQL Server, memungkinkan Anda menulis logika bisnis menggunakan prosedur dan pemicu tersimpan, lalu mengirimkannya ke server untuk dieksekusi langsung di dalam mesin database.

Dengan database relasional tradisional, Anda diharuskan untuk menangani dua bahasa pemrograman yang berbeda: bahasa pemrograman aplikasi nontransaksi, seperti JavaScript, Python, C#, atau Java; dan bahasa pemrograman transaksi, seperti T-SQL, yang dijalankan secara asli oleh database.

Mesin database di Azure Cosmos DB mendukung transaksi yang sesuai dengan ACID penuh (atomitas, konsistensi, isolasi, durabilitas) dengan isolasi rekam jepret. Semua operasi database dalam cakupan partisi logis kontainer dijalankan secara transaksional dalam mesin database yang dihosting oleh replika partisi. Operasi ini mencakup penulisan (memperbarui satu atau beberapa item dalam partisi logika) dan operasi baca.

Tabel berikut mencantumkan berbagai jenis operasi dan transaksi:

Operasi Jenis operasi Transaksi tunggal atau banyak item
Masukkan (tanpa pemicu pra/pasca) Tulis Transaksi item tunggal
Masukkan (dengan pemicu pra/post) Menulis dan membaca Transaksi multi-item
Ganti (tanpa pemicu sebelum/sesudah) Tulis Transaksi item tunggal
Mengganti (dengan pemicu sebelum/sesudah) Menulis dan membaca Transaksi multi-item
Upsert (tanpa pemicu sebelum/sesudah) Tulis Transaksi item tunggal
Upsert (tanpa pemicu pra/posting) Menulis dan membaca Transaksi multi-item
Hapus (tanpa pemicu pra/pasca) Tulis Transaksi item tunggal
Hapus (dengan pemicu sebelum/sesudah) Menulis dan membaca Transaksi multi-item
Jalankan prosedur tersimpan Menulis dan membaca Transaksi multi-item
Sistem memulai eksekusi prosedur penggabungan Tulis Transaksi multi-item
Sistem memulai eksekusi penghapusan item berdasarkan kedaluwarsa (TTL) item Tulis Transaksi multi-item
Baca Baca Transaksi item tunggal
Umpan Pembaruan Baca Transaksi multi-item
Bacaan yang dipaginasi Baca Transaksi multi-item
Kueri yang dipaginasi Baca Transaksi multi-item
Jalankan UDF sebagai bagian dari kueri paginasi Baca Transaksi multi-item

Transaksi multi-item

Azure Cosmos DB memungkinkan Anda menulis prosedur tersimpan, pemicu, dan fungsi yang ditentukan pengguna dan prosedur penggabungan di JavaScript. Azure Cosmos DB secara asli mendukung eksekusi JavaScript di dalam mesin databasenya. Anda dapat mendaftarkan prosedur tersimpan, pemicu pra/posting, fungsi yang ditentukan pengguna (UDF), dan menggabungkan prosedur pada kontainer dan kemudian menjalankannya secara transaksional dalam mesin database Azure Cosmos DB. Menulis logika aplikasi di JavaScript memungkinkan ekspresi alami aliran kontrol, scoping variabel, penugasan, dan integrasi primitif penanganan pengecualian dalam transaksi database langsung dalam bahasa JavaScript.

Prosedur tersimpan, pemicu, UDF, dan prosedur penggabungan berbasis JavaScript dibungkus dalam transaksi ACID dengan isolasi snapshot di semua item dalam partisi logis. Selama eksekusinya, jika program JavaScript melempar pengecualian, seluruh transaksi dibatalkan dan digulung balik. Model pemrograman yang dihasilkan sederhana namun kuat. Pengembang JavaScript mendapatkan model pemrograman yang tahan lama saat masih menggunakan konstruksi bahasa dan primitif perpustakaan mereka yang akrab.

Kemampuan untuk menjalankan JavaScript langsung dalam mesin database memberikan kinerja dan eksekusi transaksional operasi database terhadap item kontainer. Selain itu, karena mesin database Azure Cosmos DB secara asli mendukung JSON dan JavaScript, tidak ada ketidakcocokan impedansi antara sistem jenis aplikasi dan database.

kontrol konkurensi optimis

Kontrol konkurensi optimis (OCC) memungkinkan Anda mencegah pembaruan dan penghapusan yang hilang. Bersamaan dengan itu, operasi yang bertentangan dikenakan penguncian pesimistic reguler dari mesin dataabase yang dihosting oleh partisi logis yang memiliki item. Ketika dua operasi bersamaan mencoba memperbarui versi terbaru item dalam partisi logis, salah satunya menang dan yang lainnya gagal. Namun, jika satu atau dua operasi yang mencoba memperbarui item yang sama secara bersamaan sebelumnya telah membaca nilai item yang lebih lama, database tidak tahu apakah nilai baca sebelumnya oleh salah satu atau kedua operasi yang bertentangan memang merupakan nilai terbaru item.

Untungnya, situasi ini dapat dideteksi dengan OCC sebelum membiarkan kedua operasi memasuki batas transaksi di dalam mesin database. OCC melindungi data Anda dari mengganti perubahan yang secara tidak sengaja dibuat oleh orang lain. Ini juga mencegah orang lain secara tidak sengaja mengubah perubahan Anda sendiri.

Menerapkan kontrol konkurensi optimis menggunakan header ETag dan HTTP

Setiap item yang disimpan dalam kontainer Azure Cosmos DB memiliki properti yang ditentukan _etag sistem. Nilai dari _etag secara otomatis dihasilkan dan diperbarui oleh server setiap item tersebut diperbarui. _etag dapat digunakan dengan header permintaan klien if-match untuk memungkinkan server dalam menentukan apakah item dapat di perbarui secara kondisional. Jika nilai if-match header cocok dengan nilai _etag di server, item kemudian diperbarui. Jika nilai if-match header permintaan tidak lagi terkini, maka server akan menolak operasi dengan pesan respons "Kegagalan Prakondisi HTTP 412". Klien kemudian dapat mengambil kembali item untuk memperoleh versi item saat ini di server atau mengambil alih versi item di server dengan nilainya sendiri _etag untuk item tersebut. Selain itu, _etag dapat digunakan dengan header if-none-match untuk menentukan apakah pengambilan kembali diperlukan.

Nilai item _etag berubah setiap waktu item tersebut diperbarui Untuk merubah operasi item if-match harus secara eksplisit dinyatakan sebagai bagian dari opsi permintaan. Misalnya, lihat kode sampel di GitHub. Nilai _etag secara implisit diperiksa untuk semua item tertulis yang disentuh oleh prosedur tersimpan. Jika terdeteksi ada konflik, prosedur tersimpan akan membatalkan transaksi dan melemparkan pengecualian. Dengan metode ini, baik semua atau tidak ada penulisan di prosedur tersimpan diterapkan secara atomik. Terdapat tanda untuk menerapkan ulang pembaruan aplikasi dan mencoba kembali permintaan asli klient.

Kontrol konkurensi yang optimis dan distribusi global

Pembaruan konkurensi dari suati item diarahkan ke Kontrol konkurensi optimis oleh lapisan protokol komunikasi Azure Cosmos DB. Untuk akun Azure Cosmos DB yang dikonfigurasi untuk penulisan wilayah tunggal, Azure Cosmos DB memastikan bahwa versi sisi klien item yang Anda perbarui (atau hapus) sama dengan versi item dalam kontainer Azure Cosmos DB. Hal ini memastikan bahwa peulisan Anda terlindungi dari tertimpa perubahan secara tidak sengaja oleh penulis lain atau sebaliknya. Di lingkungan multi-pengguna, kontrol konkurensi optimis melindungi Anda dari menghapus atau memperbarui versi item yang salah secara tidak sengaja. Dengan demikian, item terlindungi terhadap masalah "kehilangan pembaruan" atau "kehilangan penghapusan" yang sudah terkenal.

Dalam akun Azure Cosmos DB yang dikonfigurasi dengan penulisan multi-wilayah, data dapat diterapkan secara independen ke wilayah sekunder jika kondisinya sesuai dengan kondisi data di wilayah lokal. Setelah data baru diterapkan secara lokal di wilayah sekunder, data tersebut kemudian digabungkan di hub atau wilayah utama. Jika kebijakan resolusi konflik menggabungkan data baru ke wilayah hub, data ini kemudian direplikasi secara global dengan yang baru _etag. Jika kebijakan resolusi konflik menolak data baru, wilayah sekunder digulung balik ke data asli dan _etag.

Langkah berikutnya

Pelajari selengkapnya tentang transaksi database dan kontrol konkurensi optimis: