Lezers zoals jij steunen MUO. Wanneer u een aankoop doet via links op onze site, kunnen we een aangesloten commissie verdienen.
Het bouwen van een productieklare webapplicatie vereist dat u ervoor zorgt dat deze veilig en schaalbaar is.
Een van de meest cruciale dingen die u over databases moet weten, is het ACID-principe dat staat voor atomiciteit, consistentie, isolatie en duurzaamheid. Relationele databases zoals MySQL ondersteunen standaard ACID-transacties. Maar MongoDB is een NoSQL-database en ondersteunt standaard geen ACID-transacties.
Als programmeur moet u weten hoe u ACID-eigenschappen in uw MongoDB-databases kunt introduceren.
Wat zijn databasetransacties?
Een databasetransactie is een reeks databasequery's of -bewerkingen die allemaal samen als één eenheid worden uitgevoerd om één taak te voltooien.
Databasetransacties houden zich aan de concepten van ACID-kenmerken. Dit helpt ervoor te zorgen dat er geen wijzigingen optreden tenzij alle bewerkingen succesvol zijn. Het zorgt er ook voor dat de database consistent is.
De ACID-eigenschappen uitgelegd
De vier eigenschappen waaruit de ACID-principes bestaan, zijn:
- atomiciteit is de eigenschap die transacties conceptualiseert als kleine eenheden van een programma. Dit houdt in dat alle query's met succes worden uitgevoerd of samen mislukken.
- Samenhang stelt dat databaserecords voor en na elke transactie consistent moeten blijven.
- Isolatie zorgt ervoor dat, wanneer meerdere transacties tegelijkertijd worden uitgevoerd, de ene geen invloed heeft op de andere.
- Duurzaamheid richt zich op systeemstoringen of fouten. Het zorgt ervoor dat een vastgelegde transactie niet verloren gaat in het geval van een systeemstoring. Dit kan technieken omvatten die nodig zijn om gegevens uit een back-up automatisch te herstellen zodra het systeem weer opstart.
MongoDB-databasetransacties implementeren in Node.js met behulp van Mongoose
MongoDB is door de jaren heen een veelgebruikte databasetechnologie geworden zijn NoSQL-aard en flexibel documentgebaseerd model. Het biedt u ook de mogelijkheid om uw gegevens beter en flexibeler te organiseren dan in SQL of relationele databases.
Om databasetransacties in MongoDB te implementeren, kunt u een voorbeeldscenario overwegen in een vacaturetoepassing waarin een gebruiker een vacature kan plaatsen, bijwerken of verwijderen. Hier is een eenvoudig databaseschema-ontwerp voor deze toepassing:
Om mee te gaan, vereist dit gedeelte basiskennis van Node.js-programmering en MongoDB.
Transacties worden niet ondersteund op zelfstandige MongoDB-installaties. U moet een gebruiken MongoDB-replicaset of MongoDB-shard-cluster om transacties te laten werken. Daarom is de gemakkelijkste manier om transacties te gebruiken maak een in de cloud gehoste MongoDB-instantie (MongoDB-atlas). Standaard is elke Atlas-database-instantie een replicaset of shard-cluster.
Nadat u een werkend Node.js- en MongoDB-project hebt opgezet, kunt u een verbinding met een Mongo-database opzetten in Node.js. Als je dat nog niet eerder hebt gedaan, installeer dan mangoest door te rennen npm installeer mangoest in uw eindstation.
importeren mangoest van 'mangoest'
laat MONGO_URL = proces.env. MONGO_URL || 'uw-mongo-database-url';
laten verbinding;
const connectDb = asynchroon () => {
poging {
wachten mangoest.connect (MONGO_URL, {
gebruikNieuweUrlParser: WAAR,
gebruik Unified Topology: WAAR,
});
console.log("VERBONDEN MET DATABASE");
verbinding = mangoest.verbinding;
} vangst (fout) {
console.fout("DATABASEVERBINDING MISLUKT!");
troosten.fout(fout.bericht);
proces.Uitgang(1); // sluit de app als de databaseverbinding mislukt
}
};
U dient de verbinding in een variabele op te slaan, zodat u deze later in het programma kunt gebruiken om een transactie te initiëren.
U kunt de verzamelingen gebruikers en taken als volgt implementeren:
const gebruikerSchema = nieuw mangoest. Schema({
naam: Snaar,
e-mail: Snaar,
banen: [mangoest. Schema. Soorten. object-id]
});const jobSchema = nieuw mangoest. Schema({
titel: Snaar,
plaats: Snaar,
salaris: Snaar,
poster: mangoest.Schema.Soorten.ObjectId
});
const userCollection = mangoest.model('gebruiker', gebruikersSchema);
const jobCollection = mangoest.model('functie', jobSchema);
U kunt een functie schrijven om een gebruiker als volgt aan de database toe te voegen:
const maakGebruiker = asynchroon (gebruiker) => {
const nieuweGebruiker = wachten userCollection.create (gebruiker);
troosten.log("Gebruiker toegevoegd aan database");
troosten.log (nieuweGebruiker);
}
De onderstaande code demonstreert de functie om een vacature aan te maken en deze toe te voegen aan de lijst met vacatures van de poster met behulp van een databasetransactie.
const createJob = asynchroon (baan) => {
const { userEmail, titel, locatie, salaris } = baan;// haal de gebruiker uit de database
const gebruiker = wachten userCollection.findOne({ e-mailen: gebruikerEmail });// start transactiesessie
const sessie = wachten verbinding.startSession();// voer alle databasequery's uit in een try-catch-blok
poging {
wachten sessie.startTransaction();// baan maken
const nieuweJob = wachten jobCollection.create(
[
{
titel,
plaats,
salaris,
poster: gebruiker._id,
},
],
{ sessie }
);
troosten.log("Gemaakt nieuw taak succesvol!");
troosten.log (nieuweTaak[0]);// vacature toevoegen aan gebruikerslijst met geplaatste vacatures
const nieuweJobId = nieuweJob[0]._ID kaart;
const toegevoegd aan gebruiker = wachten userCollection.findByIdAndUpdate(
gebruikersnaam,
{ $addToSet: { banen: nieuweJobId } },
{ sessie }
);troosten.log("Vacature met succes toegevoegd aan de takenlijst van de gebruiker");
troosten.log (toegevoegd aan gebruiker);wachten sessie.commitTransaction();
troosten.log("DB-transactie succesvol uitgevoerd");
} vangst (e) {
troosten.fout (e);
troosten.log("Kon databasebewerkingen niet voltooien");
wachten sessie.abortTransaction();
} Eindelijk {
wachten sessie.endSession();
troosten.log("Beëindigde transactiesessie");
}
};
A creëren query die in een transactie wordt uitgevoerd, neemt meestal een array op en retourneert deze. Je kunt dit zien in de code hierboven waar het wordt gemaakt nieuwe baan en slaat het op _ID kaart eigendom in denieuweJobId variabel.
Hier is een demonstratie van hoe de bovenstaande functies werken:
const mockGebruiker = {
naam: "Timmy Omolana",
e-mail: "[email protected]",
};const mockJob = {
titel: "Verkoopmanager",
locatie: "Lagos, Nigeria",
salaris: "$40,000",
userEmail: "[email protected]", // e-mail van de aangemaakte gebruiker
};const startServer = asynchroon () => {
wachten connectDb();
wachten createUser (schijngebruiker);
wachten createJob (mockJob);
};
beginServer()
.Dan()
.catch((fout) => troosten.log (fout));
Als u deze code opslaat en uitvoert met npm begin of de knooppunt opdracht, zou het een uitvoer als deze moeten produceren:
Een andere manier om ACID-transacties in MongoDB te implementeren met Mongoose is door de mettransactie() functie. Deze aanpak biedt weinig flexibiliteit omdat alle query's worden uitgevoerd binnen een callback-functie die u als argument aan de functie doorgeeft.
U kunt de bovenstaande databasetransactie refactoren om te gebruiken mettransactie() soortgelijk:
const createJob = asynchroon (baan) => {
const { userEmail, titel, locatie, salaris } = baan;// haal de gebruiker uit de database
const gebruiker = wachten userCollection.findOne({ e-mailen: gebruikerEmail });// start transactiesessie
const sessie = wachten verbinding.startSession();// voer alle databasequery's uit in een try-catch-blok
poging {
const transactieSucces = wachten sessie.metTransactie(asynchroon () => {
const nieuweJob = wachten jobCollection.create(
[
{
titel,
plaats,
salaris,
poster: gebruiker._id,
},
],
{ sessie }
);troosten.log("Gemaakt nieuw taak succesvol!");
troosten.log (nieuweTaak[0]);// vacature toevoegen aan gebruikerslijst met geplaatste vacatures
const nieuweJobId = nieuweJob[0]._ID kaart;
const toegevoegd aan gebruiker = wachten userCollection.findByIdAndUpdate(
gebruikersnaam,
{ $addToSet: { banen: nieuweJobId } },
{ sessie }
);troosten.log("Vacature met succes toegevoegd aan de takenlijst van de gebruiker");
troosten.log (toegevoegd aan gebruiker);
});
als (transactieSucces) {
troosten.log("DB-transactie succesvol uitgevoerd");
} anders {
troosten.log("Transactie mislukt");
}
} vangst (e) {
troosten.fout (e);
troosten.log("Kon databasebewerkingen niet voltooien");
} Eindelijk {
wachten sessie.endSession();
troosten.log("Beëindigde transactiesessie");
}
};
Dit zou dezelfde output opleveren als de vorige implementatie. U bent vrij om te kiezen welke stijl u wilt gebruiken bij het implementeren van databasetransacties in MongoDB.
Deze implementatie maakt geen gebruik van de committransactie() En afbrekenTransactie() functies. Dit komt doordat de mettransactie() functie voert automatisch succesvolle transacties uit en breekt mislukte transacties af. De enige functie die u in alle gevallen moet aanroepen is de sessie.endSession() functie.
Implementatie van ACID-databasetransacties in MongoDB
Databasetransacties zijn eenvoudig te gebruiken als ze correct worden uitgevoerd. U zou nu moeten begrijpen hoe databasetransacties werken in MongoDB en hoe u ze kunt implementeren in Node.js-applicaties.
Om het idee van ACID-transacties en hoe ze werken in MongoDB verder te onderzoeken, kunt u overwegen een fintech-portemonnee of blogtoepassing te bouwen.