Rumah >Peranti teknologi >industri IT >Sokongan Java dan MongoDB 4.0 untuk urus niaga asid berbilang dokumen
Monologi MongoDB 4.0 Penjelasan terperinci mengenai sokongan urus niaga asid
(artikel ini dicipta dengan kerjasama MongoDB. Terima kasih atas sokongan anda terhadap rakan kongsi yang membuat SitePoint mungkin.)
MongoDB 4.0 menambah sokongan untuk urus niaga asid berbilang dokumen. Tetapi adakah ini bermakna bahawa MongoDB tidak menyokong urus niaga sebelum ini? Tidak begitu, MongoDB sentiasa menyokong urus niaga dokumen tunggal. MongoDB 4.0 menjamin bahawa urus niaga ini boleh diperluaskan kepada pelbagai dokumen, pelbagai kenyataan, pelbagai koleksi, dan pelbagai pangkalan data. Tanpa beberapa bentuk jaminan integriti data transaksi, apakah lagi pangkalan data berguna?Sebelum menyelam ke dalam artikel ini, anda boleh mencari semua kod di sini dan cuba urus niaga asid multi-dokumen.
mata utama
Langkah 1: Mula MongoDB
Mulakan replika MongoDB tunggal dengan sekurang-kurangnya versi 4.0.0 pada port 27017 localhost.
jika anda menggunakan Docker:
anda boleh menggunakan
start-mongo.sh
Apabila anda selesai, anda boleh menggunakan stop-mongo.sh
Jika anda mahu menyambung ke MongoDB menggunakan shell mongo, anda boleh menggunakan connect-mongo.sh
mkdir /tmp/data && mongod --dbpath /tmp/data --replSet rs
mongo --eval 'rs.initiate()'
Langkah 2: Mula Java Demo ini mengandungi dua program utama: dan .
ChangeStreams.java
Perubahan aliran membolehkan anda menerima pemberitahuan sebarang perubahan data dalam koleksi MongoDB atau pangkalan data. Transactions.java
shell pertama:
shell kedua:
<code class="language-bash">./compile-docker.sh ./change-streams-docker.sh</code>Jika anda tidak menggunakan Docker, anda perlu memasang Maven 3.5.x dan JDK 10 (atau versi minimum JDK 8, tetapi anda perlu mengemas kini versi Java dalam
):
<code class="language-bash">./transactions-docker.sh</code>shell pertama:
<code class="language-bash">./compile-docker.sh ./change-streams-docker.sh</code>
shell kedua:
<code class="language-bash">./transactions-docker.sh</code>
mari kita bandingkan urus niaga dokumen tunggal yang sedia ada dengan urus niaga multi-dokumen yang serasi asid untuk MongoDB 4.0 dan belajar cara menggunakan Java untuk memanfaatkan ciri baru ini.
Versi sebelum MongoDB 4.0
Walaupun di MongoDB 3.6 dan lebih awal, setiap operasi menulis diwakili sebagai transaksi yang dilancarkan pada lapisan penyimpanan dengan tahap dokumen tunggal. Oleh kerana model dokumen menggabungkan data yang berkaitan, jika tidak memodelkan jadual ibu bapa dan anak yang berlainan dalam skema tabular, operasi dokumen tunggal atom MongoDB menyediakan semantik transaksional yang memenuhi keperluan integriti data kebanyakan aplikasi.
Setiap operasi menulis biasa yang mengubah pelbagai dokumen sebenarnya akan berlaku dalam beberapa transaksi bebas: satu transaksi setiap dokumen.
Mari kita ambil aplikasi pengurusan inventori yang sangat mudah sebagai contoh.
Pertama sekali, saya memerlukan set replika MongoDB, jadi sila mulakan MongoDB seperti yang diterangkan di atas.
Sekarang mari masukkan dokumen berikut ke dalam koleksi produk:
<code class="language-bash">./compile.sh ./change-streams.sh</code>
Dengan mengandaikan promosi sedang dijalankan, kami ingin menawarkan pelanggan kami diskaun 20% untuk semua produk.
Tetapi sebelum menggunakan diskaun ini, kami ingin menggunakan aliran perubahan untuk memantau berapa lama operasi ini berlaku di MongoDB.
Lakukan yang berikut dalam shell Mongo:
<code class="language-bash">./transactions.sh</code>
Tinggalkan cangkang ini, buka satu lagi shell mongo dan gunakan diskaun:
<code class="language-javascript">MongoDB Enterprise rs:PRIMARY> db.product.insertMany([ { "_id" : "beer", "price" : NumberDecimal("3.75"), "stock" : NumberInt(5) }, { "_id" : "wine", "price" : NumberDecimal("7.5"), "stock" : NumberInt(3) } ])</code>
Seperti yang anda lihat, kedua -dua dokumen dikemas kini menggunakan baris arahan tunggal, tetapi tidak dalam satu transaksi. Inilah yang kita lihat dalam shell aliran perubahan:
<code class="language-javascript">cursor = db.product.watch([{$match: {operationType: "update"}}]); while (!cursor.isExhausted()) { if (cursor.hasNext()) { print(tojson(cursor.next())); } }</code>
Seperti yang anda lihat, masa kluster kedua -dua operasi (lihat clusterTime
kekunci) adalah berbeza: operasi ini berlaku dalam kedua yang sama, tetapi kaunter untuk cap waktu ditingkatkan dengan 1.
Jadi di sini, kemas kini satu demi satu, walaupun ini berlaku dengan cepat, yang lain boleh membaca dokumen itu semasa kemas kini berjalan dan hanya melihat salah satu produk mempunyai diskaun.
Kebanyakan masa, ini adalah sesuatu yang anda boleh bertolak ansur dalam pangkalan data MongoDB, ketika kami cuba menanamkan data yang berkaitan atau berkaitan dengan dokumen yang sama. Oleh itu, dua kemas kini ke dokumen yang sama berlaku dalam satu transaksi:
<code class="language-javascript">PRIMARY> db.product.updateMany({}, {$mul: {price:0.8}}) { "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 } PRIMARY> db.product.find().pretty() { "_id" : "beer", "price" : NumberDecimal("3.00000000000000000"), "stock" : 5 } { "_id" : "wine", "price" : NumberDecimal("6.0000000000000000"), "stock" : 3 }</code>
MongoDB 4.0 menggunakan transaksi asid multi-dokumen
Transaksi asid multi-dokumen di MongoDB sangat mirip dengan apa yang mungkin anda pelajari dari pangkalan data hubungan tradisional.Urus niaga MongoDB adalah operasi perbualan yang berkaitan yang mesti dikemukakan secara atom atau sepenuhnya dilancarkan dengan cara pelaksanaan semua atau tidak.
Transaksi digunakan untuk memastikan operasi adalah atom walaupun merentasi pelbagai koleksi atau pangkalan data. Oleh itu, dengan menggunakan pengasingan snapshot, pengguna lain hanya dapat melihat semua tindakan atau tidak ada tindakan.
Mari kita tambahkan keranjang belanja kepada contoh kami.
Dalam contoh ini, 2 koleksi diperlukan kerana kita berurusan dengan 2 entiti perniagaan yang berbeza: pengurusan inventori dan kereta yang setiap pelanggan boleh membuat semasa membeli -belah. Setiap dokumen dalam koleksi ini mempunyai kitaran hayat yang berbeza.
Dokumentasi dalam Koleksi Produk menunjukkan item yang saya jual. Ini termasuk harga semasa produk dan inventori semasa. Saya mencipta pojo untuk mewakilinya: Product.java
.
<code class="language-bash">./compile-docker.sh ./change-streams-docker.sh</code>
Apabila pelanggan menambah item pertamanya ke kereta, kereta itu dibuat, dan apabila pelanggan terus menyemak atau meninggalkan laman web, kereta itu dipadamkan. Saya mencipta pojo untuk mewakilinya: Cart.java
.
<code class="language-bash">./transactions-docker.sh</code>
Cabaran di sini adalah bahawa saya tidak boleh menjual lebih banyak daripada yang saya ada: Jika saya mempunyai 5 bir untuk menjual, saya tidak boleh mempunyai lebih daripada 5 bir dalam kereta belanja pada pelanggan yang berbeza.
Untuk memastikan ini, saya perlu memastikan bahawa operasi membuat atau mengemas kini kereta pelanggan adalah atom dengan kemas kini inventori. Di sinilah transaksi multi-dokumen dimainkan. Jika seseorang cuba membeli sesuatu yang saya tidak ada dalam stok, urus niaga mesti gagal. Saya akan menambah kekangan kepada inventori produk:
<code class="language-bash">./compile.sh ./change-streams.sh</code>
(perhatikan bahawa ini sudah termasuk dalam kod Java.)
Untuk memantau contoh kami, kami akan menggunakan aliran perubahan MongoDB yang diperkenalkan di MongoDB 3.6.
Dalam setiap benang proses ini yang dipanggil ChangeStreams.java
, saya akan memantau salah satu daripada 2 koleksi dan mencetak setiap operasi dan masa klusternya yang berkaitan.
... (Kandungan berikut perlu ditambah dengan coretan kod Java dan penjelasan berdasarkan kod yang disediakan. Panjangnya terlalu panjang dan ditinggalkan di sini) ....
Langkah seterusnya
Terima kasih kerana meluangkan masa untuk membaca catatan saya - Saya harap anda dapati ia berguna dan menarik. Sebagai peringatan, semua kod boleh didapati di repositori GitHub ini untuk anda bereksperimen dengan.
Jika anda mencari cara yang sangat mudah untuk bermula, anda boleh melakukannya dalam hanya 5 klik dalam perkhidmatan pangkalan data MongoDB Atlas di awan.
Di samping itu, urus niaga asid multi-dokumen bukanlah satu-satunya ciri baru di MongoDB 4.0, jadi jangan ragu untuk menyemak kursus percuma kami M040: Ciri-ciri dan Alat Baru di MongoDB 4.0 di Universiti Mongodb dan Panduan kami mengenai Ciri-ciri Baru di MongoDB 4.0, di mana anda boleh mengetahui lebih lanjut mengenai penukaran jenis asli, alat visualisasi dan analisis baru, dan integrasi Kubernet.
... (kandungan berikut adalah FAQ, artikelnya terlalu panjang, ditinggalkan di sini) ....
Atas ialah kandungan terperinci Sokongan Java dan MongoDB 4.0 untuk urus niaga asid berbilang dokumen. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!