حامض

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

في عام 1983، [ 1 ] صاغ أندرياس رويتر وثيو هاردر اختصار ACID ، استنادًا إلى عمل سابق لجيم غراي [ 2 ] الذي حدد الذرية والاتساق والمتانة، دون ذكر العزل، عند وصف مفهوم المعاملات. تُعد هذه الخصائص الأربع الضمانات الرئيسية لنموذج المعاملات، الذي أثر في العديد من جوانب تطوير أنظمة قواعد البيانات .

بحسب غراي ورويتر، كان نظام إدارة المعلومات من شركة آي بي إم يدعم معاملات ACID منذ عام 1973 (على الرغم من أن الاختصار تم ابتكاره لاحقًا). [ 3 ]

يشير اختصار BASE إلى قاعدة بيانات متاحة، ذات حالة مرنة ، ومتسقة في النهاية . يُبرز هذا الاختصار أن BASE هو عكس ACID ، تمامًا كما هو الحال مع نظائرهما الكيميائية، الحمض والقاعدة . تُعطي قواعد بيانات ACID الأولوية للاتساق على التوافر - حيث تفشل العملية بأكملها إذا حدث خطأ في أي خطوة من خطواتها. في المقابل، تُعطي قواعد بيانات BASE الأولوية للتوافر على الاتساق : فبدلاً من فشل العملية، يمكن للمستخدمين الوصول إلى البيانات غير المتسقة مؤقتًا ، ما يُحقق اتساق البيانات، ولكن ليس على الفور . تميل قاعدة البيانات إما إلى ACID أو BASE، ولكن لا يمكنها أن تكون كليهما (وفقًا لنظرية CAP ). على سبيل المثال، تُبنى قواعد بيانات SQL (مثل MySQL و PostgreSQL و AWS RedShift ) وفقًا لنموذج ACID، بينما تستخدم قواعد بيانات NoSQL (مثل DynamoDB [ 4 ] أو MongoDB ) بنية BASE. مع ذلك، قد تُظهر بعض قواعد بيانات NoSQL بعض سمات ACID. [ 5 ]

صفات

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

الذرية

Transactions are often composed of multiple statements. Atomicity guarantees that each transaction is treated as a single "unit", which either succeeds completely or fails completely: if any of the statements constituting a transaction fails to complete, the entire transaction fails and the database is left unchanged. An atomic system must guarantee atomicity in each and every situation, including power failures, errors, and crashes.[6] A guarantee of atomicity prevents updates to the database from occurring only partially, which can cause greater problems than rejecting the whole series outright. As a consequence, the transaction cannot be observed to be in progress by another database client. At one moment in time, it has not yet happened, and at the next, it has already occurred in whole (or nothing happened if the transaction was cancelled in progress).

Consistency

Consistency ensures that a transaction can only bring the database from one consistent state to another, preserving database invariants: any data written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any combination thereof. This prevents database corruption by an illegal transaction. An example of a database invariant is referential integrity, which guarantees the primary keyforeign key relationship.[7]

Isolation

Transactions are often executed concurrently (e.g., multiple transactions reading and writing to a table at the same time). Isolation ensures that concurrent execution of transactions leaves the database in the same state that would have been obtained if the transactions were executed sequentially. Isolation is the main goal of concurrency control; depending on the isolation level used, the effects of an incomplete transaction might not be visible to other transactions.[8]

Durability

Durability guarantees that once a transaction has been committed, it will remain committed even in the case of a system failure (e.g., power outage or crash). This usually means that completed transactions (or their effects) are recorded in non-volatile memory.[9]

Examples

The following examples further illustrate the ACID properties. In these examples, the database table has two columns, A and B. An integrity constraint requires that the value in A and the value in B must sum to 100. The following SQL code creates a table as described above:

إنشاء جدول acidtest ( A عدد صحيح ، B عدد صحيح ، تحقق ( A + B = 100 ));

الذرية

الذرية هي ضمانة أن سلسلة عمليات قاعدة البيانات في معاملة ذرية ستُنفذ جميعها (عملية ناجحة)، أو لن تُنفذ أي منها (عملية فاشلة). لا يمكن فصل سلسلة العمليات بحيث يُنفذ جزء منها فقط، مما يجعلها "غير قابلة للتجزئة". يضمن مبدأ الذرية عدم إمكانية تحديث قاعدة البيانات جزئيًا، وهو ما قد يُسبب مشاكل أكبر من رفض السلسلة بأكملها. بعبارة أخرى، الذرية تعني عدم قابلية التجزئة وعدم قابلية الاختزال. [ 10 ] وبعبارة أخرى، يمكن القول إن المعاملة المنطقية قد تتكون من عدة معاملات فيزيائية. ولن تُعتبر المعاملة المنطقية قد تمت إلا بعد تنفيذ جميع المعاملات الفيزيائية المكونة لها.

من أمثلة المعاملات الذرية تحويل الأموال من الحساب المصرفي (أ) إلى الحساب (ب). تتكون هذه المعاملة من عمليتين: سحب الأموال من الحساب (أ) وإيداعها في الحساب (ب). لا نرغب برؤية المبلغ المسحوب من الحساب (أ) قبل التأكد من تحويله إلى الحساب (ب). يضمن تنفيذ هاتين العمليتين في معاملة ذرية بقاء قاعدة البيانات في حالة متسقة ، أي لا يتم خصم الأموال أو إضافتها إذا فشلت أي من هاتين العمليتين. [ 11 ]

فشل الاتساق

الاتساق مصطلح عام جدًا، ويشترط أن تستوفي البيانات جميع قواعد التحقق. في المثال السابق، كان التحقق هو أن يكون مجموع A و B يساوي 100. يجب فحص جميع قواعد التحقق لضمان الاتساق. لنفترض أن عملية ما تحاول طرح 10 من A دون تغيير B. نظرًا لفحص الاتساق بعد كل عملية، فمن المعروف أن A + B = 100 قبل بدء العملية. إذا نجحت العملية في طرح 10 من A ، فسيتم تحقيق الذرية. مع ذلك، سيُظهر فحص التحقق أن A + B = 90 ، وهو ما يتعارض مع قواعد قاعدة البيانات. يجب إلغاء العملية بالكامل وإعادة الصفوف المتأثرة إلى حالتها قبل العملية. لو كانت هناك قيود أو محفزات أو تسلسلات أخرى، لكان تم فحص كل عملية تغيير بنفس الطريقة المذكورة أعلاه قبل إتمام العملية. قد تنشأ مشكلات مماثلة مع قيود أخرى. على سبيل المثال، قد نشترط أن تكون أنواع بيانات كل من A و B أعدادًا صحيحة. إذا أدخلنا، على سبيل المثال، القيمة 13.5 للمتغير A ، فسيتم إلغاء العملية، أو قد يُصدر النظام تنبيهًا على شكل مُشغّل (إذا كان هذا المُشغّل مُعدًا لهذا الغرض). مثال آخر هو قيود التكامل، التي لا تسمح لنا بحذف صف في جدول ما إذا كان مفتاحه الأساسي مُشارًا إليه بواسطة مفتاح خارجي واحد على الأقل في جداول أخرى.

فشل العزل

لإثبات العزل، نفترض أن عمليتين تُنفذان في الوقت نفسه، وتحاول كل منهما تعديل البيانات نفسها. يجب على إحدى العمليتين الانتظار حتى تكتمل الأخرى للحفاظ على العزل.

لنفترض وجود معاملتين:

  • ينقل T 1 الرقم 10 من A إلى B.
  • ينقل T 2 الرقم 20 من B إلى A.

بمجموعها، هناك أربعة إجراءات:

  1. T 1 يطرح 10 من A.
  2. T 1 يضيف 10 إلى B.
  3. T 2 يطرح 20 من B.
  4. T 2 يضيف 20 إلى A.

إذا نُفذت هذه العمليات بالتسلسل، يُحافظ على العزل، مع أن العملية T2 يجب أن تنتظر. تخيّل ماذا يحدث إذا فشلت العملية T1 في منتصفها. ستتخلص قاعدة البيانات من آثار T1، ولن ترى T2 سوى البيانات الصحيحة .

من خلال دمج المعاملات، قد يكون الترتيب الفعلي للإجراءات كما يلي:

  1. T 1 يطرح 10 من A.
  2. T 2 يطرح 20 من B.
  3. T 2 يضيف 20 إلى A.
  4. T 1 يضيف 10 إلى B.

مرة أخرى، لنفترض أن العملية T1 فشلت أثناء تعديل الحقل B في الخطوة 4. عند فشل T1، تكون العملية T2 قد عدّلت الحقل A بالفعل؛ ولا يمكن استعادته إلى قيمته السابقة قبل T1 دون ترك قاعدة بيانات غير صالحة. يُعرف هذا بتنازع الكتابة المتبادلة [ 12 لأن عمليتين حاولتا الكتابة إلى نفس حقل البيانات. في نظام نموذجي، تُحل المشكلة بالعودة إلى آخر حالة سليمة معروفة، وإلغاء العملية الفاشلة T1 ، وإعادة تشغيل العملية المتوقفة T2 من الحالة السليمة.

فشل المتانة

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

تطبيق

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

القفل مقابل تعدد الإصدارات

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

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

المعاملات الموزعة

يُضيف ضمان خصائص ACID في المعاملات الموزعة عبر قواعد البيانات الموزعة ، حيث لا تتحمل أي عقدة مسؤولية جميع البيانات المؤثرة على المعاملة، تعقيدات إضافية. فقد تتعطل اتصالات الشبكة، أو قد تُكمل إحدى العقد بنجاح جزءها من المعاملة ثم تُضطر إلى التراجع عن تغييراتها بسبب عطل في عقدة أخرى. يوفر بروتوكول الالتزام ثنائي المرحلة (لا يُخلط بينه وبين القفل ثنائي المرحلة ) خاصية الذرية للمعاملات الموزعة لضمان موافقة كل مشارك في المعاملة على ما إذا كان ينبغي الالتزام بها أم لا. [ 13 ] باختصار، في المرحلة الأولى، تستعلم إحدى العقد (المنسق) من العقد الأخرى (المشاركين)، وعندما تُجيب جميعها بأنها جاهزة، يقوم المنسق، في المرحلة الثانية، بإضفاء الطابع الرسمي على المعاملة.

انظر أيضاً

مراجع

  1. هايردر، ترويتر، أ. (1983). "مبادئ استعادة قواعد البيانات الموجهة نحو المعاملات". مجلة ACM Computing Surveys . 15 (4): 287. doi : 10.1145/289.291 . S2CID 207235758 . 
  2. غراي، جيم (سبتمبر 1981). "مفهوم المعاملة: مزاياه وقيوده" (ملف PDF) . وقائع المؤتمر الدولي السابع حول قواعد البيانات الضخمة جدًا . كوبرتينو، كاليفورنيا: تانديم كمبيوترز . الصفحات 144-154 . تاريخ الاطلاع: 27 مارس 2015 . 
  3. غراي، جيم ؛ رويتر، أندرياس (1993). معالجة المعاملات الموزعة: المفاهيم والتقنيات . مورغان كوفمان . ISBN 1-55860-190-2.
  4. "اتساق قراءة DynamoDB - Amazon DynamoDB" . docs.aws.amazon.com . تم الاطلاع عليه بتاريخ 29 نوفمبر 2025. توفر عمليات القراءة مثل GetItem وQuery وScan مُعامل ConsistentRead اختياريًا. إذا قمت بتعيين ConsistentRead إلى true، فسيعيد DynamoDB استجابةً تتضمن أحدث البيانات، والتي تعكس التحديثات من جميع عمليات الكتابة السابقة الناجحة.
  5. "قواعد بيانات ACID مقابل قواعد بيانات BASE - الفرق بين قواعد البيانات - AWS" . شركة أمازون لخدمات الويب . تم الاطلاع عليه بتاريخ 24-03-2025 .
  6. "العملية الذرية" . webopedia.com . Webopedia. 25 نوفمبر 2003. تاريخ الاسترجاع: 23 مارس 2011. هي عملية يستطيع المعالج خلالها قراءة موقع وكتابته في نفس عملية ناقل البيانات. وهذا يمنع أي معالج آخر أو جهاز إدخال/إخراج من الكتابة أو القراءة من الذاكرة حتى اكتمال العملية.
  7. سي جيه ديت، "SQL ونظرية العلاقات: كيفية كتابة كود SQL دقيق، الطبعة الثانية"، أورايلي ميديا، إنك ، 2012، ص 180.
  8. Archiveddocs (2012-10-04). "مستويات العزل في محرك قاعدة البيانات" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 2023-07-14 .
  9. سيلبرشاتز، أبراهام؛ كورث، هنري ف.؛ سودارشان، س. (2011). "المعاملات". مفاهيم نظام قواعد البيانات ( الطبعة السادسة). نيويورك: ماكجرو هيل. ص 631. ISBN   978-0-07-352332-3. OCLC 436031093 . 
  10. "الذرية" . docs.oracle.com . تم الاطلاع عليه بتاريخ 13-12-2016 .
  11. أمستردام، جوناثان. "معاملات الملفات الذرية، الجزء الأول" . أورايلي . مؤرشف من الأصل بتاريخ 3 مارس 2016. تم الاطلاع عليه بتاريخ 28 فبراير 2016 .
  12. سيلبرشاتز، أبراهام؛ كورث، هنري ف.؛ سودارشان، س. (2011). "تطوير التطبيقات المتقدمة". مفاهيم أنظمة قواعد البيانات ( الطبعة السادسة). نيويورك: ماكجرو هيل. ص 1042. ISBN   978-0-07-352332-3. OCLC 436031093 . 
  13. بيرنشتاين، فيليب أ .؛ نيومر، إريك (2009). "الفصل 8". مبادئ معالجة المعاملات ( الطبعة الثانية). مورغان كوفمان (إلسيفير). ISBN  978-1-55860-623-4تمت أرشفة النسخة الأصلية بتاريخ 2010-08-07.