Читатели като вас помагат в подкрепа на MUO. Когато правите покупка чрез връзки на нашия сайт, ние може да спечелим комисионна за партньор.
Изграждането на готово за производство уеб приложение изисква да се уверите, че е безопасно и мащабируемо.
Едно от най-важните неща, които трябва да знаете за базите данни, е принципът ACID, който означава атомарност, последователност, изолация и издръжливост. Релационните бази данни като MySQL поддържат ACID транзакции нативно. Но MongoDB е NoSQL база данни и не поддържа ACID транзакции по подразбиране.
Като програмист трябва да знаете как да въвеждате ACID свойства във вашите бази данни MongoDB.
Какво представляват транзакциите с бази данни?
Транзакцията на базата данни е поредица от заявки за база данни или операции, които всички се изпълняват заедно като една единица за изпълнение на една задача.
Транзакциите в базата данни се придържат към концепциите за ACID характеристики. Това помага да се гарантира, че няма да настъпят промени, освен ако всички операции не са успешни. Той също така гарантира, че базата данни е последователна.
Обяснени са свойствата на ACID
Четирите свойства, които изграждат принципите на ACID, са:
- Атомност е свойството, което концептуализира транзакциите като малки единици на програма. Това означава, че всички заявки или се изпълняват успешно, или се провалят заедно.
- Последователност заявява, че записите в базата данни трябва да останат последователни преди и след всяка транзакция.
- Изолация гарантира, че когато множество транзакции се изпълняват едновременно, едната не засяга другата.
- Издръжливост се фокусира върху системни повреди или грешки. Той гарантира, че ангажираната транзакция не се губи в случай на повреда на системата. Това може да включва техники, необходими за автоматично възстановяване на данни от резервно копие, след като системата се появи отново.
Как да внедрите транзакции на MongoDB база данни в Node.js с помощта на Mongoose
MongoDB се превърна в широко използвана технология за бази данни през годините поради неговата NoSQL природа и гъвкав модел, базиран на документи. Той също така ви предлага възможността да организирате по-добре вашите данни и по-гъвкаво, отколкото в SQL или релационни бази данни.
За да внедрите транзакции с база данни в MongoDB, можете да разгледате примерен сценарий в приложение за списък с работни места, където потребителят може да публикува, актуализира или изтрива работа. Ето прост дизайн на схема на база данни за това приложение:
За да продължите, този раздел изисква основни познания по програмиране на Node.js и MongoDB.
Транзакциите не се поддържат при самостоятелни инсталации на MongoDB. Ще трябва да използвате a Комплект реплики на MongoDB или MongoDB сегментиран клъстер за да работят транзакциите. Следователно най-лесният начин за използване на транзакции е да създайте облачно хоствано копие на MongoDB (Атлас MongoDB). По подразбиране всеки екземпляр на база данни на Atlas е набор от реплики или фрагментиран клъстер.
След като настроите работещ Node.js и MongoDB проект, можете да настроите връзка към база данни Mongo в Node.js. Ако не сте го направили досега, инсталирайте mongoose, като стартирате npm инсталирайте mongoose във вашия терминал.
импортиране мангуста от "мангуста"
нека MONGO_URL = process.env. MONGO_URL || 'вашият-монго-база-данни-url';
позволявам Връзка;
конст connectDb = асинхронен () => {
опитвам {
изчакайте mongoose.connect (MONGO_URL, {
useNewUrlParser: вярно,
useUnifiedTopology: вярно,
});
console.log("СВЪРЗАН КЪМ БАЗА ДАННИ");
връзка = mongoose.connection;
} улов (грешка) {
console.error("ВРЪЗКАТА С БАЗАТА ДАННИ НЕ УСПЕШНА!");
конзола.грешка(грешка.съобщение);
процес.изход(1); // затворете приложението, ако връзката с базата данни е неуспешна
}
};
Трябва да съхраните връзката в променлива, за да можете да я използвате за иницииране на транзакция по-късно в програмата.
Можете да внедрите колекциите потребители и задания по следния начин:
конст потребителска схема = нов мангуста. Схема ({
име: низ,
електронна поща: низ,
работни места: [мангуста. Схема. Видове. ObjectId]
});конст jobSchema = нов мангуста. Схема ({
заглавие: низ,
местоположение: низ,
заплата: низ,
постер: мангуста.Схема.Видове.ObjectId
});
const userCollection = mongoose.model('потребител', потребителска схема);
const jobCollection = mongoose.model('работа', jobSchema);
Можете да напишете функция за добавяне на потребител към базата данни по следния начин:
конст createUser = асинхронен (потребител) => {
конст нов потребител = изчакайте userCollection.create (потребител);
конзола.log("Потребителят е добавен към базата данни");
конзола.log (нов потребител);
}
Кодът по-долу демонстрира функцията за създаване на работа и добавянето й към списъка с работни места на нейния рекламатор с помощта на транзакция в база данни.
конст createJob = асинхронен (работа) => {
конст {потребителски имейл, длъжност, местоположение, заплата} = работа;// вземете потребителя от DB
конст потребител = изчакайте userCollection.findOne({ електронна поща: потребителски имейл });// стартиране на транзакционна сесия
конст сесия = изчакайте връзка.startSession();// изпълнява всички заявки към базата данни в блок try-catch
опитвам {
изчакайте session.startTransaction();// създаване на работа
конст нова работа = изчакайте jobCollection.create(
[
{
заглавие,
местоположение,
заплата,
плакат: user._id,
},
],
{ сесия }
);
конзола.log("Създаден нов успешна работа!");
конзола.log (нова работа[0]);// добавяне на работа към потребителския списък с публикувани работни места
конст newJobId = newJob[0]._документ за самоличност;
конст addedToUser = изчакайте userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { работни места: newJobId } },
{ сесия }
);конзола.log("Успешно добавена работа към списъка със задачи на потребителя");
конзола.log (добавен към потребител);изчакайте session.commitTransaction();
конзола.log("Успешно извършена DB транзакция");
} улов (д) {
конзола.грешка (e);
конзола.log("Неуспешно завършване на операции с база данни");
изчакайте session.abortTransaction();
} накрая {
изчакайте session.endSession();
конзола.log("Приключена транзакционна сесия");
}
};
А създавам заявка, която се изпълнява в транзакция, обикновено приема и връща масив. Можете да видите това в кода по-горе, където се създава нова работа и го съхранява _документ за самоличност имот вnewJobId променлива.
Ето демонстрация как работят горните функции:
конст mockUser = {
име: "Тими Омолана",
имейл: "[email protected]",
};конст mockJob = {
заглавие: "Мениджър продажби",
местоположение: "Лагос, Нигерия",
заплата: "$40,000",
потребителски имейл: "[email protected]", // имейл на създадения потребител
};конст startServer = асинхронен () => {
изчакайте свържетеDb();
изчакайте createUser (mockUser);
изчакайте createJob (mockJob);
};
startServer()
.тогава()
.catch((err) => конзола.log (грешка));
Ако запишете този код и го стартирате с помощта на npm стартиране или възел команда, тя трябва да генерира изход като този:
Друг начин за внедряване на ACID транзакции в MongoDB с помощта на Mongoose е чрез използване на withTransaction() функция. Този подход осигурява малка гъвкавост, тъй като изпълнява всички заявки вътре във функция за обратно извикване, която предавате като аргумент на функцията.
Можете да преработите горната транзакция на базата данни, за да я използвате withTransaction() като този:
конст createJob = асинхронен (работа) => {
конст {потребителски имейл, длъжност, местоположение, заплата} = работа;// вземете потребителя от DB
конст потребител = изчакайте userCollection.findOne({ електронна поща: потребителски имейл });// стартиране на транзакционна сесия
конст сесия = изчакайте връзка.startSession();// изпълнява всички заявки към базата данни в блок try-catch
опитвам {
конст транзакцияSuccess = изчакайте session.withTransaction(асинхронен () => {
конст нова работа = изчакайте jobCollection.create(
[
{
заглавие,
местоположение,
заплата,
плакат: user._id,
},
],
{ сесия }
);конзола.log("Създаден нов успешна работа!");
конзола.log (нова работа[0]);// добавяне на работа към потребителския списък с публикувани работни места
конст newJobId = newJob[0]._документ за самоличност;
конст addedToUser = изчакайте userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { работни места: newJobId } },
{ сесия }
);конзола.log("Успешно добавена работа към списъка със задачи на потребителя");
конзола.log (добавен към потребител);
});
ако (transactionSuccess) {
конзола.log("Успешно извършена DB транзакция");
} друго {
конзола.log("Транзакцията е неуспешна");
}
} улов (д) {
конзола.грешка (e);
конзола.log("Неуспешно завършване на операции с база данни");
} накрая {
изчакайте session.endSession();
конзола.log("Приключена транзакционна сесия");
}
};
Това ще доведе до същия резултат като предишното изпълнение. Вие сте свободни да изберете кой стил да използвате, когато внедрявате транзакции с база данни в MongoDB.
Тази реализация не използва commitTransaction() и abortTransaction() функции. Това е така, защото на withTransaction() функцията автоматично извършва успешни транзакции и прекъсва неуспешните. Единствената функция, която трябва да извикате във всички случаи, е session.endSession() функция.
Внедряване на ACID транзакции с база данни в MongoDB
Транзакциите с бази данни са лесни за използване, когато се извършват правилно. Вече трябва да разберете как работят транзакциите в базата данни в MongoDB и как можете да ги внедрите в приложения Node.js.
За да проучите по-нататък идеята за ACID транзакциите и как те работят в MongoDB, обмислете изграждането на финтех портфейл или приложение за блогове.