Pembaca seperti Anda membantu mendukung MUO. Saat Anda melakukan pembelian menggunakan tautan di situs kami, kami dapat memperoleh komisi afiliasi.
Membangun aplikasi web siap produksi mengharuskan Anda untuk memastikan bahwa aplikasi tersebut aman dan dapat diskalakan.
Salah satu hal yang paling penting untuk diketahui tentang database adalah prinsip ACID yang berarti atomisitas, konsistensi, isolasi, dan daya tahan. Database relasional seperti MySQL mendukung transaksi ACID secara native. Tapi MongoDB adalah database NoSQL dan tidak mendukung transaksi ACID secara default.
Sebagai seorang programmer, Anda harus tahu cara memperkenalkan properti ACID ke dalam database MongoDB Anda.
Apa Itu Transaksi Database?
Transaksi basis data adalah urutan kueri atau operasi basis data yang semuanya dijalankan bersama sebagai satu unit untuk menyelesaikan satu tugas.
Transaksi basis data mematuhi konsep karakteristik ACID. Ini membantu memastikan bahwa tidak ada perubahan yang terjadi kecuali semua operasi berhasil. Ini juga memastikan database konsisten.
Sifat ASAM Dijelaskan
Empat sifat yang membentuk prinsip ASAM adalah:
- Atomisitas adalah properti yang mengkonseptualisasikan transaksi sebagai unit kecil dari sebuah program. Ini menyiratkan bahwa semua kueri berjalan dengan sukses atau gagal secara bersamaan.
- Konsistensi menyatakan bahwa catatan database harus tetap konsisten sebelum dan sesudah setiap transaksi.
- Isolasi memastikan bahwa, ketika beberapa transaksi berjalan secara bersamaan, yang satu tidak memengaruhi yang lain.
- Daya tahan berfokus pada kegagalan sistem atau kesalahan. Ini memastikan bahwa transaksi yang dilakukan tidak hilang jika terjadi kegagalan sistem. Ini mungkin melibatkan teknik yang diperlukan untuk memulihkan data dari cadangan secara otomatis setelah sistem muncul kembali.
Cara Menerapkan Transaksi Database MongoDB di Node.js Menggunakan Mongoose
MongoDB telah menjadi teknologi basis data yang banyak digunakan selama bertahun-tahun karena sifat NoSQL-nya dan model berbasis dokumen yang fleksibel. Ini juga menawarkan Anda kemampuan untuk mengatur data Anda dengan lebih baik dan lebih fleksibel daripada di SQL atau database relasional.
Untuk mengimplementasikan transaksi database di MongoDB, Anda dapat mempertimbangkan contoh skenario pada aplikasi daftar pekerjaan tempat pengguna dapat memposting, memperbarui, atau menghapus pekerjaan. Berikut desain skema database sederhana untuk aplikasi ini:
Untuk mengikuti, bagian ini membutuhkan pengetahuan dasar tentang pemrograman Node.js dan MongoDB.
Transaksi tidak didukung pada instalasi MongoDB mandiri. Anda harus menggunakan a Kumpulan replika MongoDB atau Kluster pecahan MongoDB agar transaksi berjalan. Oleh karena itu, cara termudah untuk menggunakan transaksi adalah dengan buat instance MongoDB yang dihosting cloud (Atlas MongoDB). Secara default, setiap instans database Atlas adalah kumpulan replika atau klaster yang dipecah.
Setelah menyiapkan proyek Node.js dan MongoDB yang berfungsi, Anda dapat mengatur koneksi ke database Mongo di Node.js. Jika Anda belum melakukannya sekarang, instal luwak dengan menjalankan npm instal luwak di terminal Anda.
impor luwak dari 'luwak'
biarkan MONGO_URL = process.env. MONGO_URL || 'url-database-mongo Anda';
membiarkan koneksi;
const connectDb = asinkron () => {
mencoba {
menunggu luwak.hubungkan (MONGO_URL, {
gunakanNewUrlParser: BENAR,
gunakanUnifiedTopology: BENAR,
});
konsol.log("TERHUBUNG KE DATABASE");
koneksi = luwak.koneksi;
} menangkap (salah) {
konsol.kesalahan("KONEKSI DATABASE GAGAL!");
menghibur.kesalahan(berbuat salah.pesan);
proses.KELUAR(1); // tutup aplikasi jika koneksi database gagal
}
};
Anda harus menyimpan koneksi dalam sebuah variabel sehingga Anda dapat menggunakannya untuk memulai transaksi nanti dalam program.
Anda dapat menerapkan koleksi pengguna dan pekerjaan seperti:
const userSchema = baru luwak. Skema({
nama: Rangkaian,
surel: Rangkaian,
pekerjaan: [luwak. Skema. Jenis. ObjectId]
});const Skema pekerjaan = baru luwak. Skema({
judul: Rangkaian,
lokasi: Rangkaian,
gaji: Rangkaian,
poster: luwak.Skema.Jenis.ObjectId
});
const Koleksipengguna = mongoose.model('pengguna', skema pengguna);
const jobCollection = mongoose.model('pekerjaan', skema pekerjaan);
Anda dapat menulis fungsi untuk menambahkan pengguna ke database seperti ini:
const buat Pengguna = asinkron (pengguna) => {
const Pengguna baru = menunggu userCollection.create (pengguna);
menghibur.log("Pengguna ditambahkan ke basis data");
menghibur.log (Pengguna baru);
}
Kode di bawah menunjukkan fungsi untuk membuat pekerjaan dan menambahkannya ke daftar pekerjaan posternya menggunakan transaksi basis data.
const buat Pekerjaan = asinkron (pekerjaan) => {
const { email pengguna, jabatan, lokasi, gaji } = pekerjaan;// dapatkan pengguna dari DB
const pengguna = menunggu userCollection.findOne({ surel: emailpengguna });// mulai sesi transaksi
const sesi = menunggu koneksi.startSession();// jalankan semua query database dalam blok try-catch
mencoba {
menunggu session.startTransaction();// buat pekerjaan
const Pekerjaan baru = menunggu jobCollection.buat(
[
{
judul,
lokasi,
gaji,
poster: pengguna._id,
},
],
{ sesi }
);
menghibur.log("Dibuat baru berhasil!");
menghibur.log (pekerjaan baru[0]);// tambahkan pekerjaan ke daftar pengguna dari pekerjaan yang diposting
const JobId baru = Pekerjaan baru[0]._pengenal;
const ditambahkanToUser = menunggu userCollection.findByIdAndUpdate(
identitas pengguna,
{ $addToSet: { pekerjaan: newJobId } },
{ sesi }
);menghibur.log("Berhasil menambahkan pekerjaan ke daftar pekerjaan pengguna");
menghibur.log (ditambahkan ke Pengguna);menunggu session.commitTransaction();
menghibur.log("Berhasil melakukan transaksi DB");
} menangkap (e) {
menghibur.error (e);
menghibur.log("Gagal menyelesaikan operasi basis data");
menunggu session.abortTransaction();
} Akhirnya {
menunggu session.endSession();
menghibur.log("Sesi transaksi berakhir");
}
};
A membuat kueri yang berjalan dalam transaksi biasanya mengambil dan mengembalikan array. Anda dapat melihat ini pada kode di atas tempatnya dibuat pekerjaan Baru dan menyimpannya _pengenal properti diJobId baru variabel.
Berikut demonstrasi cara kerja fungsi-fungsi di atas:
const mockUser = {
nama: "Timmy Omolana",
email: "[email protected]",
};const Pekerjaan tiruan = {
judul: "Manajer Penjualan",
lokasi: "Lagos, Nigeria",
gaji: "$40,000",
email pengguna: "[email protected]", // email dari pengguna yang dibuat
};const mulaiServer = asinkron () => {
menunggu connectDb();
menunggu createUser (mockUser);
menunggu createJob (mockJob);
};
mulaiServer()
.Kemudian()
.catch((err) => menghibur.log (salah));
Jika Anda menyimpan kode ini dan menjalankannya menggunakan mulai npm atau simpul perintah, itu harus menghasilkan output seperti ini:
Cara lain untuk mengimplementasikan transaksi ACID di MongoDB menggunakan Mongoose adalah dengan menggunakan withTransaction() fungsi. Pendekatan ini memberikan sedikit fleksibilitas karena menjalankan semua kueri di dalam fungsi panggilan balik yang Anda berikan sebagai argumen ke fungsi tersebut.
Anda dapat memfaktorkan ulang transaksi basis data di atas untuk digunakan withTransaction() seperti ini:
const buat Pekerjaan = asinkron (pekerjaan) => {
const { email pengguna, jabatan, lokasi, gaji } = pekerjaan;// dapatkan pengguna dari DB
const pengguna = menunggu userCollection.findOne({ surel: emailpengguna });// mulai sesi transaksi
const sesi = menunggu koneksi.startSession();// jalankan semua query database dalam blok try-catch
mencoba {
const transaksiSukses = menunggu sesi.withTransaction(asinkron () => {
const Pekerjaan baru = menunggu jobCollection.buat(
[
{
judul,
lokasi,
gaji,
poster: pengguna._id,
},
],
{ sesi }
);menghibur.log("Dibuat baru berhasil!");
menghibur.log (pekerjaan baru[0]);// tambahkan pekerjaan ke daftar pengguna dari pekerjaan yang diposting
const JobId baru = Pekerjaan baru[0]._pengenal;
const ditambahkanToUser = menunggu userCollection.findByIdAndUpdate(
identitas pengguna,
{ $addToSet: { pekerjaan: newJobId } },
{ sesi }
);menghibur.log("Berhasil menambahkan pekerjaan ke daftar pekerjaan pengguna");
menghibur.log (ditambahkan ke Pengguna);
});
jika (transaksiSukses) {
menghibur.log("Berhasil melakukan transaksi DB");
} kalau tidak {
menghibur.log("Transaksi gagal");
}
} menangkap (e) {
menghibur.error (e);
menghibur.log("Gagal menyelesaikan operasi basis data");
} Akhirnya {
menunggu session.endSession();
menghibur.log("Sesi transaksi berakhir");
}
};
Ini akan menghasilkan output yang sama dengan implementasi sebelumnya. Anda bebas memilih gaya mana yang akan digunakan saat mengimplementasikan transaksi database di MongoDB.
Implementasi ini tidak menggunakan melakukanTransaksi() Dan batalkanTransaksi() fungsi. Ini karena withTransaction() fungsi secara otomatis melakukan transaksi yang berhasil dan membatalkan yang gagal. Satu-satunya fungsi yang harus Anda panggil dalam semua kasus adalah sesi.endSession() fungsi.
Menerapkan Transaksi Database ACID di MongoDB
Transaksi basis data mudah digunakan bila dilakukan dengan benar. Anda sekarang harus memahami bagaimana transaksi Database bekerja di MongoDB dan bagaimana Anda dapat mengimplementasikannya dalam aplikasi Node.js.
Untuk mengeksplorasi lebih jauh ide transaksi ACID dan cara kerjanya di MongoDB, pertimbangkan untuk membuat dompet fintech atau aplikasi blog.