انتقل إلى محتوى الدرس
الدرس 59
دورة MySQL

المعاملات الذرية ACID والحفظ التلقائي في محرك InnoDBMySQL ACID Transactions and Autocommit in InnoDB

تعلّم المعاملات الذرية ACID والحفظ التلقائي في محرك InnoDB بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع
مخطط توضيحي لدرس المعاملات الذرية ACID والحفظ التلقائي في محرك InnoDB
مخطط توضيحي لدرس المعاملات الذرية ACID والحفظ التلقائي في محرك InnoDB

تُعرَّف المعاملة في قواعد البيانات (Database Transaction) بأنها وحدة عمل منطقية تجمع جملة SQL واحدة أو عدة جمل مترابطة بحيث تنجح جميعها معاً ككتلة واحدة أو تفشل جميعها دون ترك أي أثر جزئي يشوّه البيانات. لنفترض تحويل مبلغ 150.00 من الحساب رقم 101 إلى الحساب رقم 102؛ تتطلب هذه العملية خطوتين متلازمتين هما خصم المبلغ من المرسل وإضافته للمستقبل.

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

  • ENGINE=InnoDB: يحدد محرك التخزين الافتراضي في MySQL 8 الداعم للمعاملات الذرية وسجلات الاستعادة التلقائية.
  • DECIMAL(10, 2) NOT NULL: يخزن الأرصدة المالية بدقة عشرية ثابتة تمنع أخطاء التقريب العشري.
  • account_id INT PRIMARY KEY: ينشئ المفتاح الأساسي المتجمع الذي يعتمد عليه المحرك للوصول الفوري إلى صف الحساب المستهدف.
  • INSERT INTO wallet_ledgers: يدرج الرصيدين الابتدائيين بمجموع كلي قدره 1300.00 يجب أن يظل ثابتاً قبل التحويل وبعده.
+------------+--------+---------+
| account_id | holder | balance |
+------------+--------+---------+
|        101 | Mona   |  900.00 |
|        102 | Tariq  |  400.00 |
+------------+--------+---------+
SQL
CREATE TABLE wallet_ledgers (
    account_id INT PRIMARY KEY,
    holder VARCHAR(60) NOT NULL,
    balance DECIMAL(10, 2) NOT NULL
) ENGINE=InnoDB;

INSERT INTO wallet_ledgers VALUES (101, 'Mona', 900.00), (102, 'Tariq', 400.00);
SELECT account_id, holder, balance FROM wallet_ledgers;

تُقاس موثوقية محركات قواعد البيانات العلائقية بقدرتها على تحقيق الركائز الأربع لمعاملات ACID التي يفرضها محرك InnoDB في MySQL 8:

  • الذرية (Atomicity): مبدأ «الكل أو لا شيء»؛ إما أن تُنفَّذ جميع خطوات المعاملة بنجاح تام، أو يُلغى أثرها بالكامل عند فشل أي خطوة.
  • الاتساق (Consistency): تضمن انتقال قاعدة البيانات من حالة متسقة تحترم جميع قيود الجداول (NOT NULL وUNIQUE وCHECK وFOREIGN KEY) إلى حالة متسقة جديدة.
  • العزل (Isolation): تنفيذ المعاملات المتزامنة لعدة مستخدمين دون أن تتداخل الحسابات المؤقتة غير المعتمدة بين الجلسات.
  • الديمومة (Durability): بمجرد تأكيد اعتماد المعاملة، تُحفظ التغييرات بشكل دائم على القرص الصلب ولا تضيع حتى لو انقطع التيار الكهربائي فجأة.

نفّذ الأمر SHOW ENGINES واستعلام فحص جدول information_schema.TABLES للتحقق من أن جدولك يعمل بمحرك InnoDB الذي يُظهر القيمة YES تحت عمود Transactions:

+----------------+---------+--------------+------+------------+
| Engine         | Support | Transactions | XA   | Savepoints |
+----------------+---------+--------------+------+------------+
| InnoDB         | DEFAULT | YES          | YES  | YES        |
+----------------+---------+--------------+------+------------+
SQL
SHOW ENGINES;

SELECT TABLE_NAME, ENGINE, ROW_FORMAT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = 'wallet_ledgers';

محاكي معاملات ACID ووضع الحفظ التلقائي في InnoDB

كيف يحقق محرك InnoDB سرعة المعالجة العالية في الذاكرة العشوائية مع ضمان عدم ضياع أي بايت عند الأعطال؟ يعتمد المحرك على ثلاث آليات هندسية متكاملة:

  • سجلات التراجع (Undo Logs) للذرية والعزل: قبل تعديل أي صف في الذاكرة (Buffer Pool)، يحتفظ المحرك بنسخة من القيمة القديمة في سجل التراجع لإلغاء التعديل عند الفشل أو لتزويد الجلسات المتزامنة بقراءة متسقة.
  • سجل الإعادة (Redo Log / Write-Ahead Logging) للديمومة: عند اعتماد المعاملة، يكتب المحرك التغييرات تسلسلياً وبسرعة فائقة في ملفات سجل الإعادة على القرص ليتمكن من استعادتها تلقائياً فور إعادة تشغيل الخادم بعد أي انقطاع مفاجئ.
  • innodb_flush_log_at_trx_commit = 1: الإعداد الافتراضي الصارم في MySQL 8 الذي يضمن تفريغ ومزامنة سجل الإعادة إلى القرص الصلب عند كل عملية اعتماد.
  • innodb_doublewrite = ON: يحمي صفحات البيانات بحجم 16 كيلوبايت من الكتابة المبتورة (Torn Pages) أثناء انقطاع الكهرباء.
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
| innodb_doublewrite             | ON    |
+--------------------------------+-------+
SQL
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

SHOW VARIABLES LIKE 'innodb_doublewrite';

SHOW STATUS LIKE 'Innodb_os_log_written';

تبدأ كل جلسة اتصال جديدة بخادم MySQL 8 مع تفعيل متغير الجلسة @@autocommit على القيمة الافتراضية 1. في هذا الوضع، يعامل الخادم كل جملة INSERT أو UPDATE أو DELETE منفردة كمعاملة مستقلة ويحفظها على القرص فوراً بمجرد انتهائها دون خطأ.

عندما تحتاج إلى ربط جملتين أو أكثر في معاملة ذرية على مستوى الجلسة، يمكنك إيقاف الحفظ التلقائي مؤقتاً بالأمر SET autocommit = 0;، ثم تنفيذ التعديلات واعتمادها معاً بالأمر COMMIT;، ثم إعادة تفعيل الوضع الافتراضي:

  • SELECT @@autocommit: يفحص حالة الحفظ التلقائي في الجلسة الحالية (1 مفعّل، 0 معطّل).
  • SET autocommit = 0;: يمنع الحفظ الفوري ويبقي التعديلات اللاحقة معلّقة داخل معاملة الجلسة.
  • COMMIT;: يعتمد خصم المبلغ وإضافته معاً كعملية ذرية واحدة على القرص.
  • SET autocommit = 1;: يعيد الجلسة إلى السلوك الافتراضي بعد انتهاء العملية المجمّعة.
+--------------------+
| current_autocommit |
+--------------------+
|                  1 |
+--------------------+
SQL
SELECT @@autocommit AS current_autocommit;

SET autocommit = 0;

UPDATE wallet_ledgers SET balance = balance - 150.00 WHERE account_id = 101;
UPDATE wallet_ledgers SET balance = balance + 150.00 WHERE account_id = 102;
COMMIT;
SET autocommit = 1;

من أخطر الأخطاء الهندسية في بيئات الإنتاج إدراج أوامر تعريف البيانات (DDL) في منتصف معاملة بيانات نشطة. ففي خادم MySQL 8، تؤدي الأوامر التي تعدل هيكل الجداول إلى إطلاق حفظ ضمني فوري (Implicit Commit) يعتمد تلقائياً كل التعديلات السابقة المعلّقة في الجلسة قبل تنفيذ الأمر الهيكلي:

  • أوامر هيكلة الجداول: إن تنفيذ CREATE TABLE أو ALTER TABLE أو DROP TABLE أو RENAME TABLE أو TRUNCATE TABLE يحفظ فوراً أي تعديلات معلّقة في الجلسة دون انتظار أمر اعتماد صريح.
  • أوامر الكائنات المخزنة: تفرض أوامر CREATE VIEW وCREATE PROCEDURE وCREATE TRIGGER حفظاً ضمنياً مماثلاً.
  • الاستثناء الوحيد — الجداول المؤقتة: لا يسبب الأمران CREATE TEMPORARY TABLE وDROP TEMPORARY TABLE حفظاً ضمنياً عند وجود الكلمة المفتاحية TEMPORARY.
  • القاعدة الذهبية: افصل دائماً أوامر بناء وتعديل الجداول (Migrations) عن معاملات تحديث أرصدة وسجلات المستخدمين.
SQL
SET autocommit = 0;

UPDATE wallet_ledgers SET balance = balance + 50.00 WHERE account_id = 101;

-- DDL statements trigger an automatic implicit COMMIT before running:
CREATE TABLE transfer_audit (audit_id INT PRIMARY KEY);
SET autocommit = 1;

يلخص الجدول المرجعي التالي الركائز الأربع لنموذج ACID وآلية تحقيق كل ركيزة داخل محرك InnoDB في MySQL 8:

ركيزة ACIDالضمان الهندسي الأساسيآلية التنفيذ في InnoDBالخلل الذي تمنعه
الذرية (Atomicity)نجاح كل الخطوات معاً أو إلغاؤها بالكاملسجلات التراجع Undo Logsالتحويلات المالية المبتورة
الاتساق (Consistency)بقاء البيانات متوافقة مع كل القيودالوضع الصارم وفحص القيود المرجعيةالسجلات اليتيمة والقيم الفاسدة
العزل (Isolation)استقلال الجلسات المتزامنة عن بعضهالقطات MVCC وأقفال الصفوفالقراءة غير المعتمدة وتضارب الكتابة
الديمومة (Durability)بقاء البيانات المعتمدة رغم انقطاع التيارسجل الإعادة Redo Log والكتابة المزدوجةفقدان العمليات المعتمدة عند العطل

ملخص الدرس: تعلمت في هذا الدرس خطر التحديث الجزئي للبيانات، والركائز الأربع لنموذج ACID وكيف يطبقها محرك InnoDB عبر سجلات الإعادة والتراجع، وسلوك الحفظ التلقائي @@autocommit، والأوامر الهيكلية التي تسبب الحفظ الضمني.
الخطوة التالية والدرس القادم: انتقل إلى الدرس التالي لتعلّم التحكم الصريح بالمعاملات باستخدام أوامر START TRANSACTION وCOMMIT وROLLBACK وSAVEPOINT.

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

يجمع محرك InnoDB بين سجلات التراجع وسجلات الإعادة ومخزن الكتابة المزدوجة لضمان خصائص ACID الأربعة مع تفعيل وضع autocommit = 1 افتراضياً. الخطوة التالية: انتقل الآن إلى درس «التحكم بالمعاملات عبر COMMIT و ROLLBACK و SAVEPOINT في MySQL».

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 ACID Transactions خصائص ACID
تعلّم المعاملات الذرية ACID والحفظ التلقائي في محرك InnoDB بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Why Partial Updates Corrupt Data خطر التحديث الجزئي للبيانات
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم خطر التحديث الجزئي للبيانات في خادم MySQL 8.4.
للمراجعة
03 Four Pillars of ACID Transactions الركائز الأربع لمعاملات ACID
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم الركائز الأربع لمعاملات ACID في خادم MySQL 8.4.
للمراجعة
04 How InnoDB Guarantees ACID تحقيق ضمانات ACID في InnoDB
المفهوم الهندسي الأساسي والصياغة التطبيقية لقسم تحقيق ضمانات ACID في InnoDB في خادم MySQL 8.4.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 ACID ACID
Atomicity, Consistency, Isolation, Durability
الخصائص الأربع القياسية (الذرية، الاتساق، العزل، الديمومة) التي تضمن سلامة وموثوقية المعاملات في قواعد البيانات.
للمراجعة
02 WAL WAL
Write-Ahead Logging
تقنية التسجيل المسبق التي يكتب فيها المحرك التغييرات تسلسلياً في سجل الإعادة قبل تعديل صفحات الجداول على القرص.
للمراجعة
03 DDL DDL
Data Definition Language
أوامر تعريف وهيكلة البيانات مثل CREATE TABLE وALTER TABLE والتي تفرض حفظاً ضمنياً تلقائياً في MySQL.
للمراجعة
04 DML DML
Data Manipulation Language
أوامر معالجة السجلات مثل INSERT وUPDATE وDELETE التي تخضع لحماية المعاملات داخل محرك InnoDB.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ جمل SQL الواردة في قسم خطر التحديث الجزئي للبيانات داخل بيئة MySQL 8 المحلية وتحقق من المخرجات.

  2. جرّب الحالات الثلاث داخل محاكي معاملات ACID ووضع الحفظ التلقائي في InnoDB في قسم الركائز الأربع لمعاملات ACID وقارن سلوك المحرك.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

6أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي6 أسئلة تنتظرك
01

إلى ماذا ترمز الأحرف الأربعة في مصطلح المعاملات القياسي ACID؟

يرمز اختصار ACID إلى الذرية Atomicity والاتساق Consistency والعزل Isolation والديمومة Durability.

02

افتراضياً، تبدأ كل جلسة اتصال جديدة في خادم MySQL 8 مع ضبط المتغير @@autocommit على القيمة 1.

صواب؛ يفعّل خادم MySQL وضع الحفظ التلقائي (autocommit = 1) افتراضياً لكل اتصال جديد.

03

أي مكون داخلي في محرك InnoDB يضمن خاصية الديمومة (Durability) عبر تسجيل التعديلات المعتمدة تسلسلياً لاستعادتها عند الأعطال؟

سجل الإعادة (Redo Log) يسجل التغييرات المعتمدة تسلسلياً على القرص لضمان استعادتها بعد أي توقف مفاجئ.

04

ماذا يحدث عند تنفيذ أمر هيكلي مثل CREATE TABLE أو ALTER TABLE أثناء وجود تعديلات UPDATE معلّقة في الجلسة؟

تفرض أوامر DDL حفظاً ضمنياً تلقائياً (Implicit Commit) يعتمد جميع التعديلات المعلّقة في الجلسة فوراً.

05

ما القيمة الافتراضية للمتغير innodb_flush_log_at_trx_commit التي تحقق معيار ACID الكامل بمزامنة سجل الإعادة للقرص مع كل اعتماد؟

القيمة 1 هي الإعداد الافتراضي وتفرغ سجل الإعادة إلى القرص الصلب عند كل عملية اعتماد.

06

إذا انقطع اتصال العميل بينما autocommit = 0 وقبل إرسال الأمر COMMIT، فإن محرك InnoDB يحفظ التعديلات الناقصة نهائياً على القرص.

خطأ؛ يتراجع محرك InnoDB تلقائياً عن جميع التعديلات غير المعتمدة عند انقطاع الجلسة قبل COMMIT.