Kaltaisesi lukijat auttavat tukemaan MUO: ta. Kun teet ostoksen käyttämällä sivustollamme olevia linkkejä, voimme ansaita kumppanipalkkion.
Tuotantovalmiiden verkkosovellusten rakentaminen edellyttää, että varmistat, että se on turvallinen ja skaalautuva.
Yksi tärkeimmistä tietokannoista tiedettävistä asioista on ACID-periaate, joka tarkoittaa atomiteettia, johdonmukaisuutta, eristystä ja kestävyyttä. Relaatiotietokannat, kuten MySQL, tukevat ACID-tapahtumia natiivisti. Mutta MongoDB on NoSQL-tietokanta, eikä se tue oletuksena ACID-tapahtumia.
Ohjelmoijana sinun pitäisi tietää, kuinka ACID-ominaisuudet otetaan käyttöön MongoDB-tietokantoihin.
Mitä ovat tietokantatapahtumat?
Tietokantatapahtuma on sarja tietokantakyselyjä tai toimintoja, jotka kaikki suoritetaan yhdessä yhtenä yksikkönä yhden tehtävän suorittamiseksi.
Tietokantatapahtumat noudattavat ACID-ominaisuuksien käsitteitä. Tämä auttaa varmistamaan, että muutoksia ei tapahdu, elleivät kaikki toiminnot onnistu. Se myös varmistaa, että tietokanta on johdonmukainen.
ACID-ominaisuudet selitetty
ACID-periaatteet muodostavat neljä ominaisuutta:
- Atomuus on ominaisuus, joka käsittää tapahtumat ohjelman pieninä yksiköinä. Tämä tarkoittaa, että kaikki kyselyt joko suoritetaan onnistuneesti tai epäonnistuvat yhdessä.
- Johdonmukaisuus toteaa, että tietokantatietueiden on pysyttävä johdonmukaisina ennen ja jälkeen jokaisen tapahtuman.
- Eristäytyminen varmistaa, että kun useita tapahtumia suoritetaan samanaikaisesti, yksi ei vaikuta toiseen.
- Kestävyys keskittyy järjestelmävirheisiin tai -vioihin. Se varmistaa, että sitoutunut tapahtuma ei katoa järjestelmävian sattuessa. Tämä voi sisältää tekniikoita, jotka ovat tarpeen tietojen palauttamiseksi varmuuskopiosta automaattisesti, kun järjestelmä käynnistyy uudelleen.
Kuinka toteuttaa MongoDB-tietokantatapahtumat Node.js: ssa Mongoosea käyttämällä
MongoDB: stä on tullut laajalti käytetty tietokantatekniikka vuosien aikana sen NoSQL-luonne ja joustava dokumenttipohjainen malli. Se tarjoaa myös mahdollisuuden järjestää tietosi paremmin ja joustavammin kuin SQL- tai relaatiotietokannat.
Tietokantatapahtumien toteuttamiseksi MongoDB: ssä voit harkita esimerkkiskenaariota työluettelosovelluksessa, jossa käyttäjä voi lähettää, päivittää tai poistaa työn. Tässä on yksinkertainen tietokantaskeeman suunnittelu tälle sovellukselle:
Tämä osa edellyttää Node.js-ohjelmoinnin ja MongoDB: n perustiedot.
Tapahtumia ei tueta erillisissä MongoDB-asennuksissa. Sinun on käytettävä a MongoDB-kopiosarja tai MongoDB: n sirpaloitu klusteri jotta kaupat toimisivat. Siksi helpoin tapa käyttää tapahtumia on luo pilvipalvelussa isännöity MongoDB-ilmentymä (MongoDB Atlas). Oletuksena jokainen Atlas-tietokanta-ilmentymä on replikajoukko tai jaettu klusteri.
Kun olet määrittänyt toimivan Node.js- ja MongoDB-projektin, voit määrittää yhteyden Mongo-tietokantaan Node.js: ssä. Jos et ole tehnyt sitä aiemmin, asenna mongoose suorittamalla npm asentaa mongoose terminaalissasi.
tuonti mungo alkaen 'mungo'
anna MONGO_URL = process.env. MONGO_URL || 'sinun-mongo-tietokannan-url';
antaa yhteys;
konst connectDb = asynk () => {
yrittää {
odottaa mongoose.connect (MONGO_URL, {
useNewUrlParser: totta,
käytä UnifiedTopologya: totta,
});
console.log("YHDISTETTY TIETOKANTAAN");
yhteys = mongoose.connection;
} ottaa kiinni (err) {
console.error("TIETOKANTA-YHTEYS Epäonnistunut!");
konsoli.virhe(err.viesti);
käsitellä asiaa.poistu(1); // sulje sovellus, jos tietokantayhteys epäonnistuu
}
};
Sinun tulee tallentaa yhteys muuttujaan, jotta voit käyttää sitä tapahtuman käynnistämiseen myöhemmin ohjelmassa.
Voit toteuttaa käyttäjä- ja työkokoelmat seuraavasti:
konst userSchema = Uusi mungo. Schema({
nimi: merkkijono,
sähköposti: merkkijono,
työpaikkoja: [mungo. Kaavio. Tyypit. ObjectId]
});konst työsuunnitelma = Uusi mungo. Schema({
otsikko: merkkijono,
sijainti: merkkijono,
palkka: merkkijono,
juliste: mungo.Schema.Tyypit.ObjectId
});
const userCollection = mongoose.model('käyttäjä', userSchema);
const jobCollection = mangoose.model('Job', jobSchema);
Voit kirjoittaa funktion lisätäksesi käyttäjän tietokantaan seuraavasti:
konst createUser = asynk (käyttäjä) => {
konst uusi käyttäjä = odottaa userCollection.create (käyttäjä);
konsoli.log("Käyttäjä lisätty tietokantaan");
konsoli.log (uusi käyttäjä);
}
Alla oleva koodi esittelee toiminnon luoda työ ja lisätä se julisteensa työluetteloon tietokantatapahtuman avulla.
konst luoTyön = asynk (työ) => {
konst { userSähköposti, arvonimi, sijainti, palkka } = työpaikka;// saada käyttäjä tietokannasta
konst käyttäjä = odottaa userCollection.findOne({ sähköposti: userEmail });// aloita tapahtumaistunto
konst istunto = odottaa connection.startSession();// suorittaa kaikki tietokantakyselyt try-catch-lohkossa
yrittää {
odottaa session.startTransaction();// luo työpaikka
konst uusi työ = odottaa jobCollection.create(
[
{
otsikko,
sijainti,
palkka,
juliste: user._id,
},
],
{ istunto }
);
konsoli.log("Luotu Uusi työ onnistui!");
konsoli.log (newJob[0]);// lisää työ käyttäjien luetteloon julkaistuista työpaikoista
konst newJobId = uusiTyö[0]._id;
konst lisättyKäyttäjälle = odottaa userCollection.findByIdAndUpdate(
käyttäjätunnus,
{ $addToSet: { työpaikkoja: newJobId } },
{ istunto }
);konsoli.log("Työ lisätty käyttäjän työlistaan");
konsoli.log (lisättyKäyttäjälle);odottaa session.commitTransaction();
konsoli.log("DB-tapahtuma suoritettu onnistuneesti");
} ottaa kiinni (e) {
konsoli.error (e);
konsoli.log("Tietokantatoimintojen suorittaminen epäonnistui");
odottaa session.abortTransaction();
} vihdoinkin {
odottaa session.endSession();
konsoli.log("Päättynyt tapahtumaistunto");
}
};
A luoda tapahtumassa suoritettava kysely ottaa yleensä vastaan ja palauttaa taulukon. Näet tämän yllä olevasta koodista, jossa se luodaan uusi työ ja varastoi sen _id omaisuuttanewJobId muuttuja.
Tässä on osoitus siitä, kuinka yllä olevat toiminnot toimivat:
konst mockUser = {
nimi: "Timmy Omolana",
sähköposti: "[email protected]",
};konst mockJob = {
otsikko: "Myyntipäällikkö",
sijainti: "Lagos, Nigeria",
palkka: "$40,000",
käyttäjäSähköposti: "[email protected]", // luodun käyttäjän sähköpostiosoite
};konst startServer = asynk () => {
odottaa connectDb();
odottaa createUser (mockUser);
odottaa createJob (mockJob);
};
startServer()
.sitten()
.catch((err) => konsoli.log (err));
Jos tallennat tämän koodin ja suoritat sen käyttämällä npm aloitus tai solmu komento, sen pitäisi tuottaa seuraavanlainen tulos:
Toinen tapa toteuttaa ACID-tapahtumia MongoDB: ssä Mongoosea käyttämällä on käyttää with Transaction() toiminto. Tämä lähestymistapa tarjoaa vain vähän joustavuutta, koska se suorittaa kaikki kyselyt takaisinsoittofunktion sisällä, jotka välität funktiolle argumenttina.
Voit muuttaa yllä olevan tietokantatapahtuman käytettäväksi with Transaction() kuten tämä:
konst luoTyön = asynk (työ) => {
konst { userSähköposti, arvonimi, sijainti, palkka } = työpaikka;// saada käyttäjä tietokannasta
konst käyttäjä = odottaa userCollection.findOne({ sähköposti: userEmail });// aloita tapahtumaistunto
konst istunto = odottaa connection.startSession();// suorittaa kaikki tietokantakyselyt try-catch-lohkossa
yrittää {
konst tapahtuman onnistuminen = odottaa session.withTransaction(asynk () => {
konst uusi työ = odottaa jobCollection.create(
[
{
otsikko,
sijainti,
palkka,
juliste: user._id,
},
],
{ istunto }
);konsoli.log("Luotu Uusi työ onnistui!");
konsoli.log (newJob[0]);// lisää työ käyttäjien luetteloon julkaistuista työpaikoista
konst newJobId = uusiTyö[0]._id;
konst lisättyKäyttäjälle = odottaa userCollection.findByIdAndUpdate(
käyttäjätunnus,
{ $addToSet: { työpaikkoja: newJobId } },
{ istunto }
);konsoli.log("Työ lisätty käyttäjän työlistaan");
konsoli.log (lisättyKäyttäjälle);
});
jos (transactionSuccess) {
konsoli.log("DB-tapahtuma suoritettu onnistuneesti");
} muu {
konsoli.log("Tapahtuma epäonnistui");
}
} ottaa kiinni (e) {
konsoli.error (e);
konsoli.log("Tietokantatoimintojen suorittaminen epäonnistui");
} vihdoinkin {
odottaa session.endSession();
konsoli.log("Päättynyt tapahtumaistunto");
}
};
Tämä tuottaisi saman tuloksen kuin edellinen toteutus. Voit vapaasti valita, mitä tyyliä käytät tietokantatapahtumien toteuttamisessa MongoDB: ssä.
Tämä toteutus ei käytä commitTransaction() ja abortTransaction() toimintoja. Tämä johtuu siitä, with Transaction() toiminto suorittaa onnistuneet tapahtumat automaattisesti ja keskeyttää epäonnistuneet. Ainoa toiminto, jota sinun tulee kutsua kaikissa tapauksissa, on session.endSession() toiminto.
ACID-tietokantatransaktioiden toteuttaminen MongoDB: ssä
Tietokantatapahtumia on helppo käyttää oikein tehtynä. Sinun pitäisi nyt ymmärtää, kuinka tietokantatapahtumat toimivat MongoDB: ssä ja kuinka voit toteuttaa ne Node.js-sovelluksissa.
Jos haluat tutkia tarkemmin ACID-tapahtumien ideaa ja niiden toimintaa MongoDB: ssä, harkitse fintech-lompakon tai blogisovelluksen rakentamista.