MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Ikhtisar Transaksi ACID Multi-Dokumen di MongoDB dan Cara Menggunakannya

Sistem basis data memiliki mandat untuk menjamin konsistensi dan integritas data terutama ketika data penting dilibatkan. Aspek-aspek ini ditegakkan melalui transaksi ACID di MongoDB. Transaksi ACID harus memenuhi beberapa aturan yang ditetapkan untuk validitas data sebelum membuat pembaruan apa pun ke database, jika tidak, transaksi harus dibatalkan dan tidak ada perubahan yang dilakukan pada database. Semua transaksi database dianggap sebagai operasi logis tunggal dan selama waktu eksekusi database diletakkan dalam keadaan tidak konsisten sampai perubahan telah dilakukan. Operasi yang berhasil mengubah status database disebut sebagai transaksi tulis sedangkan operasi yang tidak memperbarui database tetapi hanya mengambil data disebut sebagai transaksi hanya baca. ACID adalah singkatan dari Atomicity, Consistency, Isolation, dan Durability.

Basis data adalah sumber daya bersama yang dapat diakses oleh pengguna yang berbeda pada waktu yang berbeda atau pada waktu yang sama. Untuk alasan ini, transaksi bersamaan dapat terjadi dan jika tidak dikelola dengan baik, dapat mengakibatkan sistem crash, kegagalan perangkat keras, kebuntuan, kinerja database yang lambat atau pengulangan dalam pelaksanaan transaksi yang sama.

Apa Itu Aturan ACID?

Semua sistem database harus memenuhi properti ACID untuk menjamin integritas data.

Atomitas

Transaksi dianggap sebagai satu unit operasi yang dapat berhasil sepenuhnya atau gagal sepenuhnya. Sebuah transaksi tidak dapat dieksekusi sebagian. Jika kondisi apapun konsultasi transaksi gagal, seluruh transaksi akan gagal sepenuhnya dan database akan tetap tidak berubah. Misalnya jika ingin mentransfer dana dari rekening X ke Y, disini ada dua transaksi, yang pertama mengeluarkan dana dari X dan yang kedua mencatat dana di Y. Jika transaksi pertama gagal, keseluruhan transaksi akan dibatalkan

Konsistensi

Ketika sebuah operasi dikeluarkan, sebelum eksekusi, database berada dalam keadaan yang konsisten dan harus tetap demikian setelah setiap transaksi. Bahkan jika ada pembaruan, transaksi harus selalu membawa database ke status valid, mempertahankan invarian database. Misalnya, Anda tidak dapat menghapus kunci utama yang telah dirujuk sebagai kunci asing di koleksi lain. Semua data harus memenuhi batasan yang ditentukan untuk mencegah korupsi data dari transaksi ilegal.

Isolasi

Beberapa transaksi yang berjalan secara bersamaan dieksekusi tanpa mempengaruhi satu sama lain dan hasilnya harus sama jika dieksekusi secara berurutan. Ketika dua atau lebih transaksi memodifikasi dokumen yang sama di MongoDB, mungkin akan terjadi konflik. Basis data akan mendeteksi konflik segera sebelum dikomit. Operasi pertama untuk mendapatkan kunci pada dokumen akan dilanjutkan sedangkan operasi lainnya akan gagal dan pesan kesalahan konflik akan ditampilkan.

Daya tahan

Ini menentukan bahwa, setelah transaksi telah dilakukan, perubahan harus ditegakkan setiap saat bahkan pada saat terjadi kegagalan sistem misalnya karena pemadaman listrik atau pemutusan internet.

Transaksi ACID MongoDB

MongoDB adalah database NoSQL berbasis dokumen dengan skema yang fleksibel. Transaksi bukanlah operasi yang harus dijalankan untuk setiap operasi tulis karena memerlukan biaya performa yang lebih besar dibandingkan dengan satu penulisan dokumen. Dengan struktur berbasis dokumen dan model data yang didenormalisasi, akan ada kebutuhan transaksi yang diminimalkan. Karena MongoDB memungkinkan penyematan dokumen, Anda tidak perlu menggunakan transaksi untuk memenuhi operasi tulis.

MongoDB versi 4.0 menyediakan dukungan transaksi multi-dokumen hanya untuk penerapan set replika dan mungkin versi 4.2 akan memperluas dukungan untuk penerapan sharded (sesuai catatan rilisnya).

Contoh transaksi:

Pastikan Anda memiliki set replika terlebih dahulu. Dengan asumsi Anda memiliki database yang disebut aplikasi dan kumpulan pengguna di Mongo Shell, jalankan perintah berikut:

$mongos dan Anda akan melihat sesuatu seperti nama pengguna:PRIMARY>

$use app

$db.users.insert([{_id:1, name: ‘Brian’}, {_id:2, name: ‘Sheila’}, {_id:3, name: ‘James’}])

Kita perlu memulai sesi untuk transaksi kita:

$db.getMongo().startSession() and you should see something like 

session { "id" : UUID("dcfa8de5-627d-3b1c-a890-63c9a355520c") }

Dengan menggunakan sesi ini, kita dapat menambahkan lebih banyak pengguna menggunakan transaksi dengan perintah berikut 

$session.startTransaction()

session.getDatabase(‘app’).users.insert({_id:4, name:  ‘Hitler’})

Anda akan disajikan dengan WriteResult({“nInsterted”:2})

Transaksi belum dilakukan dan $db.users.find({}) normal hanya akan memberi kita pengguna yang disimpan sebelumnya saja. Namun jika kita menjalankan 

$session.getDatabase(“app”).users.find()

catatan terakhir yang ditambahkan akan tersedia di hasil yang dikembalikan. Untuk melakukan transaksi ini, kami menjalankan perintah di bawah ini

$session.commitTransaction()

Modifikasi transaksi disimpan dalam memori, itulah sebabnya bahkan setelah kegagalan, data akan tersedia pada pemulihan.

Transaksi ACID Multi-Dokumen di MongoDB

Ini adalah operasi multi-pernyataan yang perlu dijalankan secara berurutan tanpa mempengaruhi satu sama lain. Untuk contoh di atas kita dapat membuat dua transaksi, satu untuk menambahkan pengguna dan satu lagi untuk memperbarui pengguna dengan bidang usia. Yaitu

$session.startTransaction()

   db.users.insert({_id:6, name “Ibrahim”})

   db.users.updateOne({_id:3 , {$set:{age:50}}})

session.commit_transaction()

Transaksi dapat diterapkan ke operasi terhadap beberapa dokumen yang terdapat dalam satu atau banyak koleksi/basis data. Perubahan apa pun karena transaksi dokumen tidak memengaruhi kinerja untuk beban kerja yang tidak terkait atau tidak memerlukannya. Sampai transaksi dilakukan, penulisan yang tidak dikomit tidak akan direplikasi ke node sekunder dan juga tidak dapat dibaca di luar transaksi.

Praktik Terbaik untuk Transaksi MongoDB

Transaksi multi-dokumen hanya didukung di mesin penyimpanan WiredTiger. Seperti yang disebutkan sebelumnya, sangat sedikit aplikasi yang memerlukan transaksi dan jika demikian, kita harus mencoba mempersingkatnya. Jika tidak, untuk satu transaksi ACID, jika Anda mencoba melakukan operasi dalam jumlah berlebihan, hal itu dapat mengakibatkan tekanan tinggi pada cache WiredTiger. Cache selalu didikte untuk mempertahankan status untuk semua penulisan berikutnya sejak snapshot terlama dibuat. Ini berarti penulisan baru akan terakumulasi dalam cache selama durasi transaksi dan akan dihapus hanya setelah transaksi yang saat ini berjalan pada snapshot lama dilakukan atau dibatalkan. Untuk kinerja database terbaik pada transaksi, pengembang harus mempertimbangkan:

  1. Selalu ubah sejumlah kecil dokumen dalam sebuah transaksi. Jika tidak, Anda perlu memecah transaksi menjadi beberapa bagian dan memproses dokumen dalam kelompok yang berbeda. Paling banyak, proses 1000 dokumen sekaligus.
  2. Pengecualian sementara seperti menunggu pemilihan jaringan primer dan jaringan sementara dapat mengakibatkan pembatalan transaksi. Pengembang harus membuat logika untuk mencoba kembali transaksi jika kesalahan yang ditentukan muncul.
  3. Konfigurasikan durasi optimal untuk eksekusi transaksi dari default 60 detik yang disediakan oleh MongoDB. Selain itu, gunakan pengindeksan sehingga memungkinkan akses data yang cepat dalam transaksi. Anda juga memiliki fleksibilitas untuk menyempurnakan transaksi dalam mengatasi waktu tunggu dengan memecahnya menjadi beberapa kelompok yang memungkinkan eksekusinya dalam batas waktu.
  4. Dekomposisi transaksi Anda menjadi sekumpulan operasi kecil sehingga sesuai dengan batasan ukuran 16MB. Jika tidak, jika operasi bersama dengan deskripsi oplog melebihi batas ini, transaksi akan dibatalkan.
  5. Semua data yang berkaitan dengan entitas harus disimpan dalam satu struktur dokumen yang kaya. Ini untuk mengurangi jumlah dokumen yang akan di-cache ketika bidang yang berbeda akan diubah.

Batasan Transaksi

  1. Anda tidak dapat membuat atau melepaskan koleksi di dalam transaksi.
  2. Transaksi tidak dapat menulis ke koleksi yang dibatasi
  3. Transaksi membutuhkan banyak waktu untuk dieksekusi dan entah bagaimana dapat memperlambat kinerja database.
  4. Ukuran transaksi dibatasi hingga 16 MB yang mengharuskan seseorang untuk membagi apa pun yang cenderung melebihi ukuran ini menjadi transaksi yang lebih kecil.
  5. Menundukan sejumlah besar dokumen ke suatu transaksi dapat memberikan tekanan yang berlebihan pada mesin WiredTiger dan karena itu bergantung pada kemampuan snapshot, akan ada retensi operasi besar yang tidak dihapus di memori. Hal ini menyebabkan beberapa biaya kinerja pada database.

Kesimpulan

MongoDB versi 4.0 memperkenalkan dukungan transaksi multi-dokumen untuk set replika sebagai fitur untuk meningkatkan integritas dan konsistensi data. Namun, ada sangat sedikit aplikasi yang memerlukan transaksi saat menggunakan MongoDB. Ada batasan terhadap fitur ini yang membuatnya sedikit tidak matang sejauh menyangkut konsep transaksi. Misalnya, transaksi untuk sharded cluster tidak didukung dan tidak boleh lebih besar dari batas ukuran 16 MB. Pemodelan data menyediakan struktur yang lebih baik untuk mengurangi transaksi dalam database Anda. Kecuali jika Anda berurusan dengan kasus khusus, sebaiknya hindari transaksi di MongoDB.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Tidak dapat mengkanonikalisasi kueri:Proyeksi BadValue tidak dapat memiliki campuran penyertaan dan pengecualian

  2. Cara Mengekspor Hasil Kueri MongoDB ke File CSV

  3. Mengapa luwak menggunakan skema ketika manfaat mongodb seharusnya adalah tanpa skema?

  4. Bagaimana Mengelola Database Besar Secara Efektif

  5. Tidak peka huruf besar indeks unik Mongo