Pada artikel ini, kita akan belajar tentang Transaksi MongoDB. Kami memiliki tiga pertanyaan umum di sini tentang Transaksi
1. Apa itu Transaksi?
2. Mengapa kami menggunakan Transaksi?
3. Di mana menggunakan Transaksi?
Jawabannya sangat sederhana, Transaksi sama seperti transaksi bank kita
1. Apa itu Transaksi?
Menjawab. Dengan kata sederhana, Transaksi pada dasarnya adalah untuk mengubah beberapa operasi baca-tulis menjadi operasi atom (Tunggal). MongoDB merilis transaksi dari 4. 0 dan seterusnya
e. g. Admin ingin memperbarui status aktif untuk semua pengguna, jadi dia akan menggunakan updateMany atau memperbarui dengan 'banyak. pilihan yang benar. Setiap kueri (updateMany/update) memperbarui semua dokumen, pembaruan setiap dokumen adalah operasi atomik, tetapi keseluruhan proses bukanlah operasi atomik
MongoDB 4. 0 Transaksi pada dasarnya tersedia untuk set replika dan MongoDB 4. 2 Transaksi tersedia untuk Sharding
Transaksi baru di MongoDB 4. 0 dan luwak 5. 2. 0. Transaksi memungkinkan Anda menjalankan beberapa operasi secara terpisah dan berpotensi membatalkan semua operasi jika salah satunya gagal. Panduan ini akan membantu Anda mulai menggunakan transaksi dengan Mongoose
Jika Anda belum melakukannya, impor luwak
import mongoose from 'mongoose';Untuk membuat transaksi, pertama-tama Anda harus membuat sesi menggunakan atau atau
Dalam praktiknya, Anda harus menggunakan fungsi Connection#transaction() Mongoose atau Mongoose untuk menjalankan transaksi. Pegangan pembantu session.withTransaction()
- Membuat transaksi
- Melakukan transaksi jika berhasil
- Membatalkan transaksi jika operasi Anda melempar
- Mencoba kembali jika terjadi kesalahan transaksi sementara
Untuk informasi selengkapnya tentang fungsi ClientSession#withTransaction()_, silakan lihat
Fungsi Connection#transaction() Mongoose adalah pembungkus di sekitar [require:transactions.*can save document after aborted transaction] 1 yang mengintegrasikan pelacakan perubahan Mongoose dengan transaksi. Misalnya, Anda [require:transactions.*can save document after aborted transaction] 2 dokumen dalam transaksi yang kemudian gagal. Perubahan dalam dokumen itu tidak dipertahankan ke MongoDB. Fungsi Connection#transaction() menginformasikan pelacakan perubahan Mongoose bahwa [require:transactions.*can save document after aborted transaction] 2 dibatalkan, dan menandai semua bidang yang diubah dalam transaksi sebagai diubah
[require:transactions.*can save document after aborted transaction] _Jika Anda mendapatkan dokumen Mongoose dari atau menggunakan sesi, dokumen tersebut akan menyimpan referensi ke sesi tersebut dan menggunakan sesi itu untuk
Untuk mendapatkan/mengatur sesi yang terkait dengan dokumen tertentu, gunakan
Fungsi [require:transactions.*can save document after aborted transaction] 9 juga mendukung transaksi. Agregasi luwak memiliki yang mengatur. Di bawah ini adalah contoh mengeksekusi agregasi dalam transaksi
const Event = db.model('Event', new Schema({ createdAt: Date }), 'Event'); let session = null; return Event.createCollection(). then(() => db.startSession()). then(_session => { session = _session; session.startTransaction(); return Event.insertMany([ { createdAt: new Date('2018-06-01') }, { createdAt: new Date('2018-06-02') }, { createdAt: new Date('2017-06-01') }, { createdAt: new Date('2017-05-31') } ], { session: session }); }). then(() => Event.aggregate([ { $group: { _id: { month: { $month: '$createdAt' }, year: { $year: '$createdAt' } }, count: { $sum: 1 } } }, { $sort: { count: -1, '_id.year': -1, '_id.month': -1 } } ]).session(session)). then(res => assert.deepEqual(res, [ { _id: { month: 6, year: 2018 }, count: 2 }, { _id: { month: 6, year: 2017 }, count: 1 }, { _id: { month: 5, year: 2017 }, count: 1 } ])). then(() => session.commitTransaction()). then(() => session.endSession()); _Pengguna tingkat lanjut yang menginginkan kontrol yang lebih baik saat melakukan atau membatalkan transaksi dapat menggunakan const Event = db.model('Event', new Schema({ createdAt: Date }), 'Event'); let session = null; return Event.createCollection(). then(() => db.startSession()). then(_session => { session = _session; session.startTransaction(); return Event.insertMany([ { createdAt: new Date('2018-06-01') }, { createdAt: new Date('2018-06-02') }, { createdAt: new Date('2017-06-01') }, { createdAt: new Date('2017-05-31') } ], { session: session }); }). then(() => Event.aggregate([ { $group: { _id: { month: { $month: '$createdAt' }, year: { $year: '$createdAt' } }, count: { $sum: 1 } } }, { $sort: { count: -1, '_id.year': -1, '_id.month': -1 } } ]).session(session)). then(res => assert.deepEqual(res, [ { _id: { month: 6, year: 2018 }, count: 2 }, { _id: { month: 6, year: 2017 }, count: 1 }, { _id: { month: 5, year: 2017 }, count: 1 } ])). then(() => session.commitTransaction()). then(() => session.endSession()); 2 untuk memulai transaksi