Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu.

Vytvorenie webovej aplikácie pripravenej na produkciu vyžaduje, aby ste sa uistili, že je bezpečná a škálovateľná.

Jednou z najdôležitejších vecí, ktoré treba vedieť o databázach, je princíp ACID, ktorý znamená atomicitu, konzistenciu, izoláciu a trvanlivosť. Relačné databázy ako MySQL natívne podporujú ACID transakcie. MongoDB je však databáza NoSQL a štandardne nepodporuje transakcie ACID.

Ako programátor by ste mali vedieť, ako zaviesť vlastnosti ACID do vašich databáz MongoDB.

Čo sú databázové transakcie?

Databázová transakcia je sekvencia databázových dotazov alebo operácií, ktoré sa všetky vykonávajú spoločne ako jedna jednotka na dokončenie jednej úlohy.

Databázové transakcie dodržiavajú koncepciu charakteristík ACID. To pomáha zaistiť, že sa nevyskytnú žiadne zmeny, pokiaľ nie sú všetky operácie úspešné. Zabezpečuje tiež konzistentnosť databázy.

Vysvetlenie vlastností ACID

instagram viewer

Štyri vlastnosti, ktoré tvoria princípy ACID, sú:

  • Atomicita je vlastnosť, ktorá konceptualizuje transakcie ako malé jednotky programu. To znamená, že všetky dopyty prebehnú úspešne alebo zlyhajú spoločne.
  • Dôslednosť uvádza, že databázové záznamy musia zostať konzistentné pred a po každej transakcii.
  • Izolácia zaisťuje, že keď prebieha viacero transakcií súčasne, jedna neovplyvní druhú.
  • Trvanlivosť sa zameriava na zlyhania alebo chyby systému. Zabezpečuje, že potvrdená transakcia sa nestratí v prípade zlyhania systému. Môže to zahŕňať techniky potrebné na automatické obnovenie údajov zo zálohy, keď sa systém znova spustí.

Ako implementovať transakcie databázy MongoDB v Node.js pomocou Mongoose

MongoDB sa v priebehu rokov stala široko používanou databázovou technológiou jeho charakter NoSQL a flexibilný model založený na dokumentoch. Ponúka vám tiež možnosť lepšieho usporiadania údajov a flexibilnejšie ako v SQL alebo relačných databázach.

Ak chcete implementovať databázové transakcie v MongoDB, môžete zvážiť vzorový scenár v aplikácii so zoznamom úloh, kde môže používateľ uverejniť, aktualizovať alebo odstrániť úlohu. Tu je jednoduchý návrh schémy databázy pre túto aplikáciu:

Ak chcete pokračovať, táto časť vyžaduje základné znalosti o programovaní Node.js a MongoDB.

Transakcie nie sú podporované na samostatných inštaláciách MongoDB. Budete musieť použiť a Súprava replík MongoDB alebo Zlomený klaster MongoDB aby transakcie fungovali. Najjednoduchší spôsob použitia transakcií je preto vytvorte inštanciu MongoDB hostenú v cloude (Atlas MongoDB). V predvolenom nastavení je každá inštancia databázy Atlas množinou replík alebo rozdeleným klastrom.

Po nastavení fungujúceho projektu Node.js a MongoDB môžete nastaviť pripojenie k databáze Mongo v Node.js. Ak ste tak ešte neurobili, nainštalujte si mongoose spustením npm nainštalovať mongoose vo vašom termináli.

importovať mangusta od "mongoose"

nech MONGO_URL = process.env. MONGO_URL || 'your-mongo-database-url';

nech spojenie;
konšt connectDb = async () => {
skúste {
čakať mongoose.connect (MONGO_URL, {
useNewUrlParser: pravda,
použiteUnifiedTopology: pravda,
});

console.log("PRIPOJENÉ K DATABÁZE");
spojenie = mangoose.spojenie;
} chytiť (chyba) {
console.error("PRIPOJENIE K DATABÁZE ZLYHALO!");
konzoly.chyba(chybovať.správa);
proces.VÝCHOD(1); // zatvorte aplikáciu, ak zlyhá pripojenie k databáze
}
};

Pripojenie by ste mali uložiť do premennej, aby ste ju mohli použiť na iniciovanie transakcie neskôr v programe.

Kolekcie používateľov a úloh môžete implementovať takto:

konšt userSchema = Nový mangusta. Schéma({
názov: Reťazec,
email: Reťazec,
pracovných miest: [mangusta. Schéma. Typy. ObjectId]
});

konšt jobSchema = Nový mangusta. Schéma({
názov: Reťazec,
miesto: Reťazec,
plat: Reťazec,
plagát: mangusta.Schéma.Typy.ObjectId
});

const userCollection = mongoose.model('užívateľ', userSchema);
const jobCollection = mongoose.model('prácu', jobSchema);

Môžete napísať funkciu na pridanie používateľa do databázy takto:


konšt createUser = async (používateľ) => {
konšt nový používateľ = čakať userCollection.create (používateľ);
konzoly.log("Používateľ pridaný do databázy");
konzoly.log (novýPoužívateľ);
}

Nižšie uvedený kód demonštruje funkciu vytvorenia úlohy a jej pridania do zoznamu úloh na plagáte pomocou databázovej transakcie.


konšt vytvoriťJob = async (práca) => {
konšt { userEmail, title, location, plat } = job;

// získajte používateľa z DB
konšt užívateľ = čakať userCollection.findOne({ email: userEmail });

// spustenie relácie transakcie
konšt relácia = čakať connection.startSession();

// spustiť všetky databázové dotazy v bloku try-catch
skúste {
čakať session.startTransaction();

// vytvoriť pracovné miesto
konšt nová práca = čakať jobCollection.create(
[
{
titul,
umiestnenie,
plat,
plagát: user._id,
},
],
{ session }
);
konzoly.log("Vytvorené Nový práca úspešne!");
konzoly.log (newJob[0]);

// pridanie úlohy do zoznamu uverejnených úloh používateľov
konšt newJobId = newJob[0]._id;
konšt addedToUser = čakať userCollection.findByIdAndUpdate(
ID používateľa,
{ $addToSet: { pracovných miest: newJobId } },
{ session }
);

konzoly.log("Úloha bola úspešne pridaná do zoznamu úloh používateľa");
konzoly.log (addedToUser);

čakať session.commitTransaction();

konzoly.log("Úspešne vykonaná transakcia DB");
} chytiť (e) {
konzoly.chyba (e);
konzoly.log("Nepodarilo sa dokončiť operácie databázy");
čakať session.abortTransaction();
} konečne {
čakať session.endSession();
konzoly.log("Ukončená relácia transakcie");
}
};

A vytvoriť dotaz, ktorý beží v transakcii, zvyčajne zaberie a vráti pole. Môžete to vidieť v kóde vyššie, kde sa vytvára Nová práca a ukladá svoje _id majetok vnewJobId premenlivý.

Tu je ukážka toho, ako fungujú vyššie uvedené funkcie:

konšt mockUser = {
meno: "Timmy Omolana",
email: "[email protected]",
};

konšt mockJob = {
názov: "Manažér predaja",
miesto: "Lagos, Nigéria",
plat: "$40,000",
userEmail: "[email protected]", // email vytvoreného užívateľa
};

konšt štartServer = async () => {
čakať connectDb();
čakať createUser (mockUser);
čakať createJob (mockJob);
};

startServer()
.potom()
.catch((chyba) => konzoly.log (chyba));

Ak uložíte tento kód a spustíte ho pomocou npm štart alebo uzol príkaz, mal by vytvoriť takýto výstup:

Ďalším spôsobom implementácie transakcií ACID v MongoDB pomocou Mongoose je použitie withTransaction() funkciu. Tento prístup poskytuje malú flexibilitu, pretože spúšťa všetky dotazy vo funkcii spätného volania, ktorú odošlete funkcii ako argument.

Môžete refaktorovať vyššie uvedenú databázovú transakciu na použitie withTransaction() Páči sa ti to:

konšt vytvoriťJob = async (práca) => {
konšt { userEmail, title, location, plat } = job;

// získajte používateľa z DB
konšt užívateľ = čakať userCollection.findOne({ email: userEmail });

// spustenie relácie transakcie
konšt relácia = čakať connection.startSession();

// spustiť všetky databázové dotazy v bloku try-catch
skúste {
konšt transakciaÚspech = čakať session.withTransaction(async () => {
konšt nová práca = čakať jobCollection.create(
[
{
titul,
umiestnenie,
plat,
plagát: user._id,
},
],
{ session }
);

konzoly.log("Vytvorené Nový práca úspešne!");
konzoly.log (newJob[0]);

// pridanie úlohy do zoznamu uverejnených úloh používateľov
konšt newJobId = newJob[0]._id;
konšt addedToUser = čakať userCollection.findByIdAndUpdate(
ID používateľa,
{ $addToSet: { pracovných miest: newJobId } },
{ session }
);

konzoly.log("Úloha bola úspešne pridaná do zoznamu úloh používateľa");
konzoly.log (addedToUser);
});

ak (transactionSuccess) {
konzoly.log("Úspešne vykonaná transakcia DB");
} inak {
konzoly.log("Transakcia zlyhala");
}
} chytiť (e) {
konzoly.chyba (e);
konzoly.log("Nepodarilo sa dokončiť operácie databázy");
} konečne {
čakať session.endSession();
konzoly.log("Ukončená relácia transakcie");
}
};

Výsledkom by bol rovnaký výstup ako pri predchádzajúcej implementácii. Môžete si vybrať, ktorý štýl použijete pri implementácii databázových transakcií v MongoDB.

Táto implementácia nepoužíva commitTransaction() a abortTransaction() funkcie. Je to preto, že withTransaction() funkcia automaticky potvrdí úspešné transakcie a zruší tie neúspešné. Jediná funkcia, ktorú by ste mali volať vo všetkých prípadoch, je session.endSession() funkciu.

Implementácia ACID databázových transakcií v MongoDB

Databázové transakcie sa ľahko používajú, keď sa vykonávajú správne. Teraz by ste mali pochopiť, ako databázové transakcie fungujú v MongoDB a ako ich môžete implementovať do aplikácií Node.js.

Ak chcete ďalej preskúmať myšlienku transakcií ACID a toho, ako fungujú v MongoDB, zvážte vytvorenie fintech peňaženky alebo aplikácie na blogovanie.