القراء مثلك يساعدون في دعم MUO. عند إجراء عملية شراء باستخدام الروابط الموجودة على موقعنا ، فقد نربح عمولة تابعة.

يتطلب إنشاء تطبيق ويب جاهز للإنتاج التأكد من أنه آمن وقابل للتطوير.

من أهم الأشياء التي يجب معرفتها حول قواعد البيانات هو مبدأ ACID الذي يرمز إلى الذرية والاتساق والعزلة والمتانة. تدعم قواعد البيانات العلائقية مثل MySQL معاملات ACID محليًا. لكن MongoDB هي قاعدة بيانات NoSQL ولا تدعم معاملات ACID افتراضيًا.

بصفتك مبرمجًا ، يجب أن تعرف كيفية إدخال خصائص ACID في قواعد بيانات MongoDB الخاصة بك.

ما هي معاملات قاعدة البيانات؟

معاملة قاعدة البيانات هي سلسلة من استعلامات قاعدة البيانات أو العمليات التي يتم تنفيذها معًا كوحدة واحدة لإكمال مهمة واحدة.

تلتزم معاملات قواعد البيانات بمفاهيم خصائص حامض ACID. يساعد هذا في ضمان عدم حدوث أي تغييرات ما لم تنجح جميع العمليات. كما يضمن أن قاعدة البيانات متسقة.

وأوضح خصائص حمض

الخصائص الأربعة التي تتكون منها مبادئ حمض هي:

  • الذرية هي الخاصية التي تصور المعاملات كوحدات صغيرة من البرنامج. هذا يعني أن جميع الاستعلامات إما تعمل بنجاح أو تفشل معًا.
  • تناسق تنص على أن سجلات قاعدة البيانات يجب أن تظل متسقة قبل كل معاملة وبعدها.
  • instagram viewer
  • عزل يضمن أنه عند تشغيل معاملات متعددة في وقت واحد ، لا تؤثر إحداها على الأخرى.
  • متانة يركز على فشل النظام أو أعطاله. يضمن عدم فقدان معاملة ملتزمة في حالة فشل النظام. قد يتضمن ذلك تقنيات ضرورية لاستعادة البيانات من نسخة احتياطية تلقائيًا بمجرد ظهور النظام مرة أخرى.

كيفية تنفيذ معاملات قاعدة بيانات MongoDB في Node.js باستخدام Mongoose

أصبحت MongoDB تقنية قواعد بيانات مستخدمة على نطاق واسع على مر السنين بسبب طبيعة NoSQL ونموذج مستند إلى مستند مرن. كما يوفر لك القدرة على تنظيم بياناتك بشكل أفضل وأكثر مرونة من SQL أو قواعد البيانات العلائقية.

لتنفيذ معاملات قاعدة البيانات في MongoDB ، يمكنك التفكير في نموذج سيناريو لتطبيق قائمة الوظائف حيث يمكن للمستخدم نشر وظيفة أو تحديثها أو حذفها. إليك تصميم مخطط قاعدة بيانات بسيط لهذا التطبيق:

للمتابعة ، يتطلب هذا القسم معرفة أساسية ببرمجة Node.js و MongoDB.

لا يتم دعم المعاملات في عمليات تثبيت MongoDB المستقلة. ستحتاج إلى استخدام ملف مجموعة نسخ MongoDB أو كتلة MongoDB المكسورة للمعاملات للعمل. لذلك ، فإن أسهل طريقة لاستخدام المعاملات هي إنشاء مثيل MongoDB مستضاف على السحابة (MongoDB أطلس). بشكل افتراضي ، تكون كل طبعة قاعدة بيانات Atlas عبارة عن مجموعة نسخ متماثلة أو كتلة مجزأة.

بعد إعداد Node.js ومشروع MongoDB ، يمكنك إعداد اتصال بقاعدة بيانات Mongo في Node.js. إذا لم تكن قد قمت بذلك من قبل ، فقم بتثبيت النمس عن طريق الجري npm تثبيت النمس في محطتك.

يستورد النمس من 'النمس'

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

يترك اتصال؛
مقدار ثابت connectDb = غير متزامن () => {
يحاول {
انتظر mongoose.connect (MONGO_URL ، {
useNewUrlParser: حقيقي,
استخدامUnifiedTopology: حقيقي,
});

console.log ("متصل بقاعدة البيانات");
اتصال = mongoose.connection ؛
} يمسك (يخطئ) {
خطأ وحدة التحكم ("فشل اتصال قاعدة البيانات!");
وحدة التحكم.خطأ(يخطئ.رسالة);
عملية.مخرج(1); // أغلق التطبيق إذا فشل اتصال قاعدة البيانات
}
};

يجب عليك تخزين الاتصال في متغير حتى تتمكن من استخدامه لبدء معاملة لاحقًا في البرنامج.

يمكنك تنفيذ مجموعات المستخدمين والوظائف مثل:

مقدار ثابت userSchema = جديد النمس. مخطط({
اسم: خيط,
بريد إلكتروني: خيط,
وظائف: [النمس. مخطط. أنواع. معرف الكائن]
});

مقدار ثابت jobSchema = جديد النمس. مخطط({
عنوان: خيط,
موقع: خيط,
مرتب: خيط,
ملصق: النمس.مخطط. الأنواع.معرف الكائن
});

const userCollection = mongoose.model ('مستخدم'، userSchema) ؛
وظيفة constCollection = mongoose.model ('وظيفة'، jobSchema)؛

يمكنك كتابة وظيفة لإضافة مستخدم إلى قاعدة البيانات مثل هذا:


مقدار ثابت createUser = غير متزامن (مستخدم) => {
مقدار ثابت مستخدم جديد = انتظر userCollection.create (مستخدم) ؛
وحدة التحكم.log ("تمت إضافة المستخدم إلى قاعدة البيانات") ؛
وحدة التحكم.log (مستخدم جديد) ؛
}

يوضح الكود أدناه وظيفة إنشاء وظيفة وإضافتها إلى قائمة وظائف الملصق باستخدام معاملة قاعدة البيانات.


مقدار ثابت createJob = غير متزامن (وظيفة) => {
مقدار ثابت {userEmail، title، location، insurance} = job؛

// احصل على المستخدم من قاعدة البيانات
مقدار ثابت المستخدم = انتظر userCollection.findOne ({ بريد إلكتروني: البريد الالكتروني للمستخدم })؛

// بدء جلسة المعاملة
مقدار ثابت جلسة = انتظر connect.startSession () ؛

// قم بتشغيل جميع استعلامات قاعدة البيانات في كتلة try-catch
يحاول {
انتظر session.startransaction () ؛

// خلق وظيفة
مقدار ثابت وظيفة جديدة = انتظر jobCollection.create (
[
{
عنوان،
موقع،
مرتب،
الملصق: user._id ،
},
],
{ حصة }
);
وحدة التحكم.log ("تم الإنشاء جديد العمل بنجاح! ") ؛
وحدة التحكم.log (newJob [0]);

// إضافة وظيفة إلى قائمة المستخدمين للوظائف المنشورة
مقدار ثابت newJobId = newJob [0]._بطاقة تعريف؛
مقدار ثابت addedToUser = انتظر userCollection.findByIdAndUpdate (
معرف المستخدم،
{ addToSet دولار: { وظائف: newJobId}}،
{ حصة }
);

وحدة التحكم.log ("تمت إضافة الوظيفة بنجاح إلى قائمة وظائف المستخدم") ؛
وحدة التحكم.log (addedToUser) ،

انتظر session.commitTransaction () ؛

وحدة التحكم.log ("تم تنفيذ معاملة DB بنجاح") ؛
} يمسك (هـ) {
وحدة التحكم. Error (e) ؛
وحدة التحكم.log ("فشل إكمال عمليات قاعدة البيانات") ؛
انتظر session.abortTransaction () ؛
} أخيراً {
انتظر session.endSession () ؛
وحدة التحكم.log ("جلسة المعاملة المنتهية") ؛
}
};

أ يخلق عادة ما يأخذ الاستعلام الذي يتم تشغيله في معاملة مصفوفة ويقوم بإرجاعها. يمكنك رؤية هذا في الكود أعلاه حيث يتم إنشاؤه عمل جديد ويخزن لها _بطاقة تعريف الممتلكات فيnewJobId عامل.

فيما يلي عرض توضيحي لكيفية عمل الوظائف المذكورة أعلاه:

مقدار ثابت mockUser = {
الاسم: "تيمي أومولانا" ،
البريد الإلكتروني: "[email protected]" ،
};

مقدار ثابت mockJob = {
اللقب: "مدير المبيعات" ،
الموقع: "لاغوس ، نيجيريا" ،
الراتب: "دولار40,000",
userEmail: "[email protected]// البريد الإلكتروني للمستخدم الذي تم إنشاؤه
};

مقدار ثابت startServer = غير متزامن () => {
انتظر connectDb () ،
انتظر createUser (mockUser) ؛
انتظر createJob (mockJob) ؛
};

startServer ()
.ثم()
. الصيد ((يخطئ) => وحدة التحكم.log (يخطئ)) ؛

إذا قمت بحفظ هذا الرمز وتشغيله باستخدام بدء npm أو ال العقدة الأمر ، يجب أن ينتج مخرجات مثل هذا:

هناك طريقة أخرى لتنفيذ معاملات ACID في MongoDB باستخدام Mongoose وهي استخدام مع المعاملة () وظيفة. يوفر هذا الأسلوب القليل من المرونة حيث يقوم بتشغيل جميع الاستعلامات داخل دالة رد الاتصال التي تقوم بتمريرها كوسيطة للدالة.

يمكنك إعادة بناء معاملة قاعدة البيانات أعلاه لاستخدامها مع المعاملة () مثله:

مقدار ثابت createJob = غير متزامن (وظيفة) => {
مقدار ثابت {userEmail، title، location، insurance} = job؛

// احصل على المستخدم من قاعدة البيانات
مقدار ثابت المستخدم = انتظر userCollection.findOne ({ بريد إلكتروني: البريد الالكتروني للمستخدم })؛

// بدء جلسة المعاملة
مقدار ثابت جلسة = انتظر connect.startSession () ؛

// قم بتشغيل جميع استعلامات قاعدة البيانات في كتلة try-catch
يحاول {
مقدار ثابت transactionSuccess = انتظر session.withTransaction (غير متزامن () => {
مقدار ثابت وظيفة جديدة = انتظر jobCollection.create (
[
{
عنوان،
موقع،
مرتب،
الملصق: user._id ،
},
],
{ حصة }
);

وحدة التحكم.log ("تم الإنشاء جديد العمل بنجاح! ") ؛
وحدة التحكم.log (newJob [0]);

// إضافة وظيفة إلى قائمة المستخدمين للوظائف المنشورة
مقدار ثابت newJobId = newJob [0]._بطاقة تعريف؛
مقدار ثابت addedToUser = انتظر userCollection.findByIdAndUpdate (
معرف المستخدم،
{ addToSet دولار: { وظائف: newJobId}}،
{ حصة }
);

وحدة التحكم.log ("تمت إضافة الوظيفة بنجاح إلى قائمة وظائف المستخدم") ؛
وحدة التحكم.log (addedToUser) ،
});

لو (transactionSuccess) {
وحدة التحكم.log ("تم تنفيذ معاملة DB بنجاح") ؛
} آخر {
وحدة التحكم.log ("فشلت المعاملة") ؛
}
} يمسك (هـ) {
وحدة التحكم. Error (e) ؛
وحدة التحكم.log ("فشل إكمال عمليات قاعدة البيانات") ؛
} أخيراً {
انتظر session.endSession () ؛
وحدة التحكم.log ("جلسة المعاملة المنتهية") ؛
}
};

هذا من شأنه أن ينتج نفس الناتج مثل التنفيذ السابق. أنت حر في اختيار النمط الذي تريد استخدامه عند تنفيذ معاملات قاعدة البيانات في MongoDB.

هذا التطبيق لا يستخدم الالتزام () و إحباط المعاملة () المهام. هذا لأن ملف مع المعاملة () تقوم الوظيفة تلقائيًا بإجراء معاملات ناجحة وإحباط المعاملات الفاشلة. الوظيفة الوحيدة التي يجب عليك الاتصال بها في جميع الحالات هي session.endSession () وظيفة.

تنفيذ معاملات قاعدة بيانات حمض في MongoDB

تعتبر معاملات قاعدة البيانات سهلة الاستخدام عند إجرائها بشكل صحيح. يجب أن تفهم الآن كيفية عمل معاملات قاعدة البيانات في MongoDB وكيف يمكنك تنفيذها في تطبيقات Node.js.

لمزيد من استكشاف فكرة معاملات ACID وكيفية عملها في MongoDB ، فكر في إنشاء محفظة fintech أو تطبيق التدوين.