سؤال

كنت أقرأ فقط عن RDBMS ، وممتلكات واحدة من RDBMS هي الذرة.لذلك ، إذا تم سحب الأموال من حساب وتحويله إلى آخر ، فستتحدث المعاملة تمامًا أو لا.لا توجد معاملات جزئية.ولكن كيف يتم ضمانه بالفعل؟

قد تبدو استعلامات SQL للسيناريو أعلاه (I) تحديث accounts تعيين الرصيد = الرصيد - المبلغ الذي تحديث AC_NUM = 101 (ii) accounts تعيين الرصيد = الرصيد + المبلغ حيث ac_num = 102

الذي لا يضمن بأي حال من الأحوال الذرية..فكيف يحدث ذلك في الواقع؟

هل كانت مفيدة؟

المحلول

إذا كنت تفعل

BEGIN TRANSACTION
UPDATE accounts set balance = balance - amount WHERE ac_num = 101
UPDATE accounts set balance = balance + amount WHERE ac_num = 102
COMMIT TRANSACTION

ونظام قاعدة البيانات وكتابة الملاحظات على ما قام به لإجراء تغييرات على حساب 101. ثم إذا ستفشل العمل على حساب 102، يستخدم RDBMS هذه المذكرات إلى التراجع عن العمل على 101.

وعلاوة على ذلك، عندما بدأ العمل على حساب 101 غير يأخذ تأمين على قاعدة البيانات، بحيث لا أحد آخر أن يأتي وقراءة تحديث، ولكن ليس بيانات ملتزمة في حساب 101. (A قفل هنا هو في الأساس مجرد ملاحظة في مكان ما "أنا أعمل هنا، لا تلمس".)

نصائح أخرى

لكي تكون المعاملات ذرية، يجب أن:

  • منع المعاملات الأخرى من التدخل في الصفوف التي يكتبونها أو يقرأونها
  • تأكد من أن جميع التغييرات التي تجريها المعاملة أو لا شيء منها ستكون موجودة في قاعدة البيانات عند تنفيذ المعاملة.

يتم تحقيق الأول عن طريق قفل الصفوف التي تقرأها المعاملة أو تكتبها أثناء تنفيذها.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top