Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju.

Izrada web aplikacije spremne za proizvodnju zahtijeva da osigurate da je sigurna i skalabilna.

Jedna od najvažnijih stvari koje treba znati o bazama podataka je ACID princip koji označava atomičnost, dosljednost, izolaciju i trajnost. Relacijske baze podataka poput MySQL izvorno podržavaju ACID transakcije. Ali MongoDB je NoSQL baza podataka i prema zadanim postavkama ne podržava ACID transakcije.

Kao programer, trebali biste znati kako uvesti ACID svojstva u vaše MongoDB baze podataka.

Što su transakcije baze podataka?

Transakcija baze podataka je slijed upita baze podataka ili operacija koje se svi zajedno izvršavaju kao jedna jedinica za dovršenje jednog zadatka.

Transakcije baze podataka pridržavaju se koncepta ACID karakteristika. To pomaže da se osigura da se nikakve promjene ne događaju osim ako sve operacije nisu uspješne. Također osigurava dosljednost baze podataka.

instagram viewer

Objašnjena svojstva ACID-a

Četiri svojstva koja čine ACID principe su:

  • Valentnost je svojstvo koje konceptualizira transakcije kao male jedinice programa. To implicira da se svi upiti ili uspješno izvode ili ne uspijevaju zajedno.
  • Dosljednost navodi da zapisi baze podataka moraju ostati dosljedni prije i nakon svake transakcije.
  • Izolacija osigurava da, kada se više transakcija izvodi istovremeno, jedna ne utječe na drugu.
  • Izdržljivost usredotočuje se na kvarove ili kvarove sustava. Osigurava da se izvršena transakcija ne izgubi u slučaju kvara sustava. To može uključivati ​​tehnike potrebne za automatsko vraćanje podataka iz sigurnosne kopije nakon što se sustav ponovno pokrene.

Kako implementirati MongoDB transakcije baze podataka u Node.js koristeći Mongoose

MongoDB je postao naširoko korištena tehnologija baze podataka tijekom godina zbog njegovu NoSQL prirodu i fleksibilni model temeljen na dokumentima. Također vam nudi mogućnost da bolje organizirate svoje podatke i fleksibilnije nego u SQL ili relacijskim bazama podataka.

Za implementaciju transakcija baze podataka u MongoDB, možete razmotriti primjer scenarija na aplikaciji za popis poslova gdje korisnik može objaviti, ažurirati ili izbrisati posao. Evo jednostavnog dizajna sheme baze podataka za ovu aplikaciju:

Za nastavak, ovaj odjeljak zahtijeva osnovno znanje o programiranju Node.js i MongoDB.

Transakcije nisu podržane na samostalnim instalacijama MongoDB-a. Morat ćete upotrijebiti a MongoDB set replika ili MongoDB razdvojeni klaster kako bi transakcije funkcionirale. Stoga je najlakši način korištenja transakcija stvoriti MongoDB instancu smještenu u oblaku (MongoDB Atlas). Prema zadanim postavkama, svaka instanca baze podataka Atlas je skup replika ili razdvojeni klaster.

Nakon postavljanja radnog Node.js i MongoDB projekta, možete postaviti vezu s Mongo bazom podataka u Node.js. Ako do sada niste, instalirajte mongoose pokretanjem npm instalirajte mongoose u vašem terminalu.

uvoz mungos iz 'mungos'

neka MONGO_URL = process.env. MONGO_URL || 'vaša-mongo-baza-podataka url';

neka veza;
konst spojiDb = asinkroni () => {
probati {
čekati mongoose.connect (MONGO_URL, {
useNewUrlParser: pravi,
useUnifiedTopology: pravi,
});

console.log("POVEZAN NA BAZU PODATAKA");
veza = mungos.veza;
} ulov (pogreška) {
console.error("POVEZIVANJE NA BAZU PODATAKA NIJE USPJELO!");
konzola.pogreška(pogriješiti.poruka);
postupak.Izlaz(1); // zatvorite aplikaciju ako povezivanje s bazom podataka ne uspije
}
};

Trebali biste pohraniti vezu u varijablu kako biste je mogli koristiti za pokretanje transakcije kasnije u programu.

Kolekcije korisnika i poslova možete implementirati ovako:

konst korisnička shema = novi mungos. Shema({
Ime: Niz,
email: Niz,
radnih mjesta: [mungos. Shema. Vrste. ObjectId]
});

konst shema posla = novi mungos. Shema({
titula: Niz,
mjesto: Niz,
plaća: Niz,
poster: mungos.Shema.Vrste.ObjectId
});

const userCollection = mongoose.model('korisnik', korisnička shema);
const jobCollection = mongoose.model('posao', shema posla);

Možete napisati funkciju za dodavanje korisnika u bazu podataka ovako:


konst createUser = asinkroni (korisnik) => {
konst noviKorisnik = čekati userCollection.create (korisnik);
konzola.log("Korisnik dodan u bazu podataka");
konzola.log (noviKorisnik);
}

Kôd u nastavku demonstrira funkciju za stvaranje posla i njegovo dodavanje na popis poslova korisnika pomoću transakcije baze podataka.


konst stvoritiPosao = asinkroni (posao) => {
konst { userEmail, title, location, salary } = posao;

// dobiti korisnika iz DB-a
konst korisnik = čekati userCollection.findOne({ elektronička pošta: korisnička e-pošta });

// početak transakcijske sesije
konst sesija = čekati veza.startSession();

// pokreni sve upite baze podataka u bloku try-catch
probati {
čekati session.startTransaction();

// stvoriti posao
konst novi posao = čekati jobCollection.create(
[
{
titula,
mjesto,
plaća,
poster: user._id,
},
],
{ sesija }
);
konzola.log("Stvoreno novi uspješan posao!");
konzola.log (noviPosao[0]);

// dodaj posao na korisnički popis objavljenih poslova
konst newJobId = newJob[0]._iskaznica;
konst dodanoKorisniku = čekati userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { radnih mjesta: newJobId } },
{ sesija }
);

konzola.log("Uspješno dodan posao na korisničku listu poslova");
konzola.log (dodanKorisniku);

čekati session.commitTransaction();

konzola.log("Uspješno provedena DB transakcija");
} ulov (e) {
konzola.greška (e);
konzola.log("Neuspješno dovršavanje operacija baze podataka");
čekati session.abortTransaction();
} konačno {
čekati session.endSession();
konzola.log("Završena sesija transakcije");
}
};

A stvoriti upit koji se izvodi u transakciji obično uzima i vraća niz. To možete vidjeti u gornjem kodu gdje se stvara novi posao i pohranjuje svoje _iskaznica vlasništvo unewJobId varijabla.

Evo demonstracije kako gore navedene funkcije rade:

konst mockUser = {
ime: "Timmy Omolana",
email: "[email protected]",
};

konst mockJob = {
naziv: "Voditelj prodaje",
mjesto: "Lagos, Nigerija",
plaća: "$40,000",
korisnička e-pošta: "[email protected]", // email stvorenog korisnika
};

konst startServer = asinkroni () => {
čekati spojiDb();
čekati createUser (mockUser);
čekati stvoritiPosao (mockJob);
};

startServer()
.zatim()
.catch((err) => konzola.log (pogreška));

Ako spremite ovaj kod i pokrenete ga pomoću npm početak ili čvor naredba, trebala bi proizvesti ovakav izlaz:

Drugi način implementacije ACID transakcija u MongoDB pomoću Mongoosea je korištenje s Transakcijom() funkcija. Ovaj pristup pruža malu fleksibilnost jer pokreće sve upite unutar funkcije povratnog poziva koju prosljeđujete kao argument funkciji.

Možete refaktorirati gornju transakciju baze podataka za korištenje s Transakcijom() kao ovo:

konst stvoritiPosao = asinkroni (posao) => {
konst { userEmail, title, location, salary } = posao;

// dobiti korisnika iz DB-a
konst korisnik = čekati userCollection.findOne({ elektronička pošta: korisnička e-pošta });

// početak transakcijske sesije
konst sesija = čekati veza.startSession();

// pokreni sve upite baze podataka u bloku try-catch
probati {
konst transakcijaSuccess = čekati session.withTransaction(asinkroni () => {
konst novi posao = čekati jobCollection.create(
[
{
titula,
mjesto,
plaća,
poster: user._id,
},
],
{ sesija }
);

konzola.log("Stvoreno novi uspješan posao!");
konzola.log (noviPosao[0]);

// dodaj posao na korisnički popis objavljenih poslova
konst newJobId = newJob[0]._iskaznica;
konst dodanoKorisniku = čekati userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { radnih mjesta: newJobId } },
{ sesija }
);

konzola.log("Uspješno dodan posao na korisničku listu poslova");
konzola.log (dodanKorisniku);
});

ako (transactionSuccess) {
konzola.log("Uspješno provedena DB transakcija");
} drugo {
konzola.log("Transakcija nije uspjela");
}
} ulov (e) {
konzola.greška (e);
konzola.log("Neuspješno dovršavanje operacija baze podataka");
} konačno {
čekati session.endSession();
konzola.log("Završena sesija transakcije");
}
};

Ovo bi proizvelo isti rezultat kao prethodna implementacija. Slobodni ste odabrati koji ćete stil koristiti prilikom implementacije transakcija baze podataka u MongoDB.

Ova implementacija ne koristi izvrši Transakciju() i prekinutiTransakciju() funkcije. To je zato što s Transakcijom() funkcija automatski izvršava uspješne transakcije i prekida neuspješne. Jedina funkcija koju biste trebali pozvati u svim slučajevima je session.endSession() funkcija.

Implementacija ACID transakcija baze podataka u MongoDB

Transakcije baze podataka jednostavne su za korištenje ako se pravilno izvrše. Sada biste trebali razumjeti kako transakcije baze podataka rade u MongoDB-u i kako ih možete implementirati u Node.js aplikacijama.

Da biste dalje istražili ideju ACID transakcija i kako one funkcioniraju u MongoDB-u, razmislite o izgradnji fintech novčanika ili aplikacije za bloganje.