קוראים כמוך עוזרים לתמוך ב-MUO. כאשר אתה מבצע רכישה באמצעות קישורים באתר שלנו, אנו עשויים להרוויח עמלת שותף.

בניית יישום אינטרנט מוכן לייצור מחייב אותך להבטיח שהוא בטוח וניתן להרחבה.

אחד הדברים החשובים ביותר שיש לדעת על מסדי נתונים הוא עקרון ה-ACID המייצג אטומיות, עקביות, בידוד ועמידות. מסדי נתונים יחסיים כמו MySQL תומכים בעסקאות ACID באופן מקורי. אבל MongoDB הוא מסד נתונים NoSQL ואינו תומך בעסקאות ACID כברירת מחדל.

כמתכנת, עליך לדעת כיצד להכניס מאפייני ACID למאגרי המידע של MongoDB.

מהן עסקאות במסד נתונים?

עסקת מסד נתונים היא רצף של שאילתות או פעולות של מסד נתונים שכולן מבוצעות יחד כיחידה אחת להשלמת משימה אחת.

עסקאות במסד נתונים תואמות למושגים של מאפייני ACID. זה עוזר להבטיח שלא יתרחשו שינויים אלא אם כל הפעולות יצליחו. זה גם מבטיח שמסד הנתונים יהיה עקבי.

ההסבר על מאפייני ה-ACID

ארבעת המאפיינים המרכיבים את עקרונות ה-ACID הם:

  • אָטוֹמִיוּת הוא המאפיין שממשיג עסקאות כיחידות קטנות של תוכנית. זה מרמז שכל השאילתות פועלות בהצלחה או נכשלות יחד.
  • עֲקֵבִיוּת קובע שרשומות מסד הנתונים חייבות להישאר עקביות לפני ואחרי כל עסקה.
  • instagram viewer
  • בידוד מבטיח שכאשר עסקאות מרובות פועלות בו זמנית, אחת לא תשפיע על השנייה.
  • עֲמִידוּת מתמקד בכשלים או תקלות במערכת. זה מבטיח שעסקה מחויבת לא תאבד במקרה של כשל במערכת. זה עשוי לכלול טכניקות הדרושות לשחזור נתונים מגיבוי אוטומטית ברגע שהמערכת עולה שוב.

כיצד ליישם עסקאות מסד נתונים של MongoDB ב-Node.js באמצעות Mongoose

MongoDB הפכה לטכנולוגיית מסד נתונים בשימוש נרחב במהלך השנים בשל אופי ה-NoSQL שלו ומודל גמיש מבוסס מסמכים. זה גם מציע לך את היכולת לארגן טוב יותר את הנתונים שלך ובגמישות רבה יותר מאשר ב-SQL או במסדי נתונים יחסיים.

כדי ליישם עסקאות מסד נתונים ב- MongoDB, אתה יכול לשקול תרחיש לדוגמה ביישום רישום משרות שבו משתמש יכול לפרסם, לעדכן או למחוק משרה. להלן עיצוב סכימת מסד נתונים פשוט עבור יישום זה:

כדי לעקוב, סעיף זה דורש ידע בסיסי בתכנות Node.js ו-MongoDB.

עסקאות אינן נתמכות בהתקנות עצמאיות של MongoDB. תצטרך להשתמש ב-a סט רפליקה של MongoDB אוֹ מקבץ מפורק של MongoDB כדי שהעסקאות יעבדו. לכן, הדרך הקלה ביותר להשתמש בעסקאות היא לעשות צור מופע MongoDB המתארח בענן (MongoDB Atlas). כברירת מחדל, כל מופע של מסד נתונים של Atlas הוא ערכת העתק או אשכול מפוצל.

לאחר הגדרת פרויקט Node.js ו-MongoDB עובדים, אתה יכול להגדיר חיבור למסד נתונים של Mongo ב-Node.js. אם לא עשית זאת לפני כן, התקן נמייה על ידי ריצה npm להתקין נמייה בטרמינל שלך.

יְבוּא נְמִיָה מ 'נְמִיָה'

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

לתת חיבור;
const connectDb = אסינכרון () => {
לְנַסוֹת {
לְהַמתִין mongoose.connect (MONGO_URL, {
useNewUrlParser: נָכוֹן,
useUnifiedTopology: נָכוֹן,
});

console.log("מחובר לבסיס נתונים");
חיבור = mongoose.connection;
} לתפוס (שגיאה) {
console.error("חיבור מסד הנתונים נכשל!");
לְנַחֵם.שְׁגִיאָה(לִטְעוֹת.הוֹדָעָה);
תהליך.יְצִיאָה(1); // סגור את האפליקציה אם חיבור מסד הנתונים נכשל
}
};

עליך לאחסן את החיבור במשתנה כדי שתוכל להשתמש בו כדי ליזום עסקה מאוחר יותר בתוכנית.

אתה יכול ליישם את אוספי המשתמשים ועבודות כך:

const userSchema = חָדָשׁ נְמִיָה. סכֵימָה({
שֵׁם: חוּט,
אימייל: חוּט,
מקומות תעסוקה: [נְמִיָה. סכֵימָה. סוגים. ObjectId]
});

const jobSchema = חָדָשׁ נְמִיָה. סכֵימָה({
כותרת: חוּט,
מקום: חוּט,
שכר: חוּט,
פּוֹסטֵר: נְמִיָה.סכֵימָה.סוגים.ObjectId
});

const userCollection = mongoose.model('מִשׁתַמֵשׁ', userSchema);
const jobCollection = mongoose.model('עבודה', jobSchema);

אתה יכול לכתוב פונקציה להוספת משתמש למסד הנתונים כך:


const createUser = אסינכרון (משתמש) => {
const newUser = לְהַמתִין userCollection.create (משתמש);
לְנַחֵם.log("משתמש נוסף למסד הנתונים");
לְנַחֵם.log (newUser);
}

הקוד שלהלן מדגים את הפונקציה ליצור עבודה ולהוסיף אותה לרשימת העבודות של הפוסטר שלה באמצעות עסקת מסד נתונים.


const createJob = אסינכרון (עבודה) => {
const { userEmail, title, location, salary } = עבודה;

// קבל את המשתמש מה-DB
const משתמש = לְהַמתִין userCollection.findOne({ אימייל: userEmail });

// התחל הפעלת עסקה
const מפגש = לְהַמתִין connection.startSession();

// הפעל את כל שאילתות מסד הנתונים בבלוק try-catch
לְנַסוֹת {
לְהַמתִין session.startTransaction();

// ליצור עבודה
const newJob = לְהַמתִין jobCollection.create(
[
{
כותרת,
מקום,
שכר,
פוסטר: user._id,
},
],
{ הפעלה }
);
לְנַחֵם.log("נוצר חָדָשׁ עבודה בהצלחה!");
לְנַחֵם.log (newJob[0]);

// הוסף עבודה לרשימת המשתמשים של המשרות שפורסמו
const newJobId = newJob[0]._תְעוּדַת זֶהוּת;
const addedToUser = לְהַמתִין userCollection.findByIdAndUpdate(
זהות המשתמש,
{ $addToSet: { מקומות תעסוקה: newJobId } },
{ הפעלה }
);

לְנַחֵם.log("עבודה נוספה בהצלחה לרשימת המשרות של המשתמש");
לְנַחֵם.log (addedToUser);

לְהַמתִין session.commitTransaction();

לְנַחֵם.log("עסקת DB בוצעה בהצלחה");
} לתפוס (ה) {
לְנַחֵםשגיאה (ה);
לְנַחֵם.log("נכשל בהשלמת פעולות מסד הנתונים");
לְהַמתִין session.abortTransaction();
} סוף כל סוף {
לְהַמתִין session.endSession();
לְנַחֵם.log("הפעלת עסקה הסתיימה");
}
};

א לִיצוֹר שאילתה שפועלת בעסקה בדרך כלל לוקחת ומחזירה מערך. אתה יכול לראות את זה בקוד למעלה שבו הוא יוצר עבודה חדשה ומאחסן את זה _תְעוּדַת זֶהוּת נכס בnewJobId מִשְׁתַנֶה.

להלן הדגמה כיצד פועלות הפונקציות לעיל:

const mockUser = {
שם: "טימי אומולנה",
דוא"ל: "[email protected]",
};

const mockJob = {
title: "מנהל מכירות",
מיקום: "לאגוס, ניגריה",
משכורת: "$40,000",
userEmail: "[email protected]", // אימייל של המשתמש שנוצר
};

const startServer = אסינכרון () => {
לְהַמתִין connectDb();
לְהַמתִין createUser (mockUser);
לְהַמתִין createJob (mockJob);
};

startServer()
.לאחר מכן()
.catch((err) => לְנַחֵם.log (שגיאה));

אם תשמור את הקוד הזה ותפעיל אותו באמצעות התחלה של npm או ה צוֹמֶת הפקודה, זה אמור לייצר פלט כזה:

דרך נוספת ליישם עסקאות ACID ב-MongoDB באמצעות Mongoose היא באמצעות withTransaction() פוּנקצִיָה. גישה זו מספקת גמישות מועטה מכיוון שהיא מריצה את כל השאילתות בתוך פונקציית התקשרות חוזרת שאתה מעביר כארגומנט לפונקציה.

אתה יכול לשחזר את עסקת מסד הנתונים לעיל לשימוש withTransaction() ככה:

const createJob = אסינכרון (עבודה) => {
const { userEmail, title, location, salary } = עבודה;

// קבל את המשתמש מה-DB
const משתמש = לְהַמתִין userCollection.findOne({ אימייל: userEmail });

// התחל הפעלת עסקה
const מפגש = לְהַמתִין connection.startSession();

// הפעל את כל שאילתות מסד הנתונים בבלוק try-catch
לְנַסוֹת {
const transactionSuccess = לְהַמתִין session.withTransaction(אסינכרון () => {
const newJob = לְהַמתִין jobCollection.create(
[
{
כותרת,
מקום,
שכר,
פוסטר: user._id,
},
],
{ הפעלה }
);

לְנַחֵם.log("נוצר חָדָשׁ עבודה בהצלחה!");
לְנַחֵם.log (newJob[0]);

// הוסף עבודה לרשימת המשתמשים של המשרות שפורסמו
const newJobId = newJob[0]._תְעוּדַת זֶהוּת;
const addedToUser = לְהַמתִין userCollection.findByIdAndUpdate(
זהות המשתמש,
{ $addToSet: { מקומות תעסוקה: newJobId } },
{ הפעלה }
);

לְנַחֵם.log("עבודה נוספה בהצלחה לרשימת המשרות של המשתמש");
לְנַחֵם.log (addedToUser);
});

אם (transactionSuccess) {
לְנַחֵם.log("עסקת DB בוצעה בהצלחה");
} אַחֵר {
לְנַחֵם.log("העסקה נכשלה");
}
} לתפוס (ה) {
לְנַחֵםשגיאה (ה);
לְנַחֵם.log("נכשל בהשלמת פעולות מסד הנתונים");
} סוף כל סוף {
לְהַמתִין session.endSession();
לְנַחֵם.log("הפעלת עסקה הסתיימה");
}
};

זה ייצור את אותו פלט כמו היישום הקודם. אתה חופשי לבחור באיזה סגנון להשתמש בעת יישום עסקאות מסד נתונים ב- MongoDB.

יישום זה אינו משתמש ב- commitTransaction() ו abortTransaction() פונקציות. זה בגלל ש withTransaction() הפונקציה מבצעת אוטומטית עסקאות מוצלחות ומבטלת עסקאות שנכשלו. הפונקציה היחידה שאתה צריך להתקשר אליה בכל המקרים היא session.endSession() פוּנקצִיָה.

יישום עסקאות מסד נתונים של ACID ב- MongoDB

עסקאות במסד נתונים קלות לשימוש כאשר הן מבוצעות בצורה נכונה. כעת עליך להבין כיצד פועלות עסקאות מסד נתונים ב- MongoDB וכיצד ניתן ליישם אותן ביישומי Node.js.

כדי להמשיך ולחקור את הרעיון של עסקאות ACID וכיצד הן פועלות ב- MongoDB, שקול לבנות ארנק פינטק או יישום בלוגים.