Saya menggunakan "mongoose": "^5.7.1"
dalam proyek Node.js saya. Saya membuat api yang melibatkan pembaruan dalam dua dokumen. Jadi, saya menggunakan transaksi seperti berikut:
// Start the transaction
session = await mongoose.startSession()
session.startTransaction()
await Promise.all([
<1st update operation>,
<2nd update operation>
])
// Commit the transaction
session.commitTransaction()
Ketika saya menyalakan api ini di lingkungan lokal saya, saya mendapatkan kesalahan berikut:
MongoError: Ini penyebaran MongoDB tidak mendukung menulis retryable. Silakan tambahkan retryWrites = false ke string koneksi Anda.
Ketika saya menyalakan api ini di lingkungan yang jauh, maka itu berjalan dengan baik. Saya menggunakan https://www.clever-cloud.com sebagai database cloud dan AWS sebagai api cloud.
Seperti yang tertulis dalam pesan kesalahan, saya telah mencoba untuk menempatkan retryWrites=false
- pada akhir string koneksi yang saya lewati untuk luoose
mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
- dengan opsi yang
retryWrites: false
diteruskan kemongoose.connect
metode.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
retryWrites: false
}, (err) => {...})
Tidak satu pun di atas yang menyelesaikan masalah.
Di bawah ini adalah output dari mongo --version
perintah:
db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
distarch: x86_64
target_arch: x86_64
Saya telah men-debug dan menemukan kesalahan aktual di balik melempar kesalahan ini adalah:
MongoError: Nomor transaksi hanya diperbolehkan pada set anggota replika atau mongo
Tolong sarankan sesuatu.
Jawaban:
Transaksi tidak diragukan lagi fitur baru yang paling menarik di MongoDB 4.0. Namun sayangnya, sebagian besar alat untuk menginstal dan menjalankan MongoDB memulai server mandiri sebagai lawan dari set replika. Jika Anda mencoba memulai sesi pada server mandiri, Anda akan mendapatkan kesalahan ini.
Masalah ini dapat diatasi dengan menggunakan set replika di lingkungan lokal Anda.
Saya telah menggunakan run-rs untuk tujuan ini.
sumber
Seperti yang disarankan dalam jawaban yang diterima, Anda harus memiliki server lokal Anda untuk dijalankan sebagai set replika untuk dapat melakukan transaksi, sebagai lawan dari server mandiri.
Namun, di samping solusi yang diusulkan, Anda dapat dengan mudah mengkonversi db lokal Standalone Anda ke Set Replika tanpa menggunakan alat pihak ketiga , dengan mengikuti petunjuk dalam dokumentasi MongoDB , diringkas sebagai berikut:
replSet
argumen.mongo
shell, dan jalankan Set Replika yang baru.Sekarang Anda harus memiliki Set Replika alih-alih server mongodb mandiri, di mana Anda dapat melakukan transaksi di lingkungan lokal Anda untuk memperbarui beberapa dokumen sekaligus!
Jangan lupa untuk memasukkan
replSet
argumen setiap kali Anda ingin memulai server, jika tidak maka akan dimulai sebagai Standalone. Saya cukup menggunakan perintah yang sama seperti pada langkah 1 untuk menjalankannya lagi.Atau, Anda dapat menggunakan Set Replika baru dari awal untuk lingkungan pengujian mengikuti instruksi lain ini dalam dokumentasi MongoDB.
sumber
Harap Edit
App/Config/database
file Tambahkan'retryWrites'=>false
dalam String Koneksi Mongodbtulis koneksi Mongo db
Simpan dan Jalankan
sumber
Silakan coba tambahkan
&retryWrites=false
ke string koneksi Anda-
Saya benar-benar mendapatkan kesalahan yang disebutkan dalam OP ketika menghubungkan ke server db jarak jauh kami, padahal itu bekerja secara lokal. Saya menghubungi dukungan mongo-host kami sebelum mencoba saran yang ada dalam kesalahan.
-
Ini adalah apa yang dikatakan situs mongo yang dihosting (mLab) kami:
Kemungkinan driver aplikasi Anda diperbarui ke versi yang lebih baru yang mencoba menggunakan fitur WiredTiger saja. Ketika kesalahan menyebutkan, Anda harus menambahkan & coba lagi = palsu ke string koneksi Anda.
https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-number-are-only-allowed-on-storage-engines-that-support-document-level-locking-error
sumber