في هذا الدرس 6تصفّح المواضيع
تُعرَّف المعاملة في قواعد البيانات (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 |
+------------+--------+---------+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 |
+----------------+---------+--------------+------+------------+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 |
+--------------------------------+-------+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 |
+--------------------+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) عن معاملات تحديث أرصدة وسجلات المستخدمين.
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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ جمل SQL الواردة في قسم خطر التحديث الجزئي للبيانات داخل بيئة MySQL 8 المحلية وتحقق من المخرجات.
-
جرّب الحالات الثلاث داخل محاكي معاملات ACID ووضع الحفظ التلقائي في InnoDB في قسم الركائز الأربع لمعاملات ACID وقارن سلوك المحرك.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي6 أسئلة تنتظرك +
إلى ماذا ترمز الأحرف الأربعة في مصطلح المعاملات القياسي ACID؟
يرمز اختصار ACID إلى الذرية Atomicity والاتساق Consistency والعزل Isolation والديمومة Durability.
افتراضياً، تبدأ كل جلسة اتصال جديدة في خادم MySQL 8 مع ضبط المتغير @@autocommit على القيمة 1.
صواب؛ يفعّل خادم MySQL وضع الحفظ التلقائي (autocommit = 1) افتراضياً لكل اتصال جديد.
أي مكون داخلي في محرك InnoDB يضمن خاصية الديمومة (Durability) عبر تسجيل التعديلات المعتمدة تسلسلياً لاستعادتها عند الأعطال؟
سجل الإعادة (Redo Log) يسجل التغييرات المعتمدة تسلسلياً على القرص لضمان استعادتها بعد أي توقف مفاجئ.
ماذا يحدث عند تنفيذ أمر هيكلي مثل CREATE TABLE أو ALTER TABLE أثناء وجود تعديلات UPDATE معلّقة في الجلسة؟
تفرض أوامر DDL حفظاً ضمنياً تلقائياً (Implicit Commit) يعتمد جميع التعديلات المعلّقة في الجلسة فوراً.
ما القيمة الافتراضية للمتغير innodb_flush_log_at_trx_commit التي تحقق معيار ACID الكامل بمزامنة سجل الإعادة للقرص مع كل اعتماد؟
القيمة 1 هي الإعداد الافتراضي وتفرغ سجل الإعادة إلى القرص الصلب عند كل عملية اعتماد.
إذا انقطع اتصال العميل بينما autocommit = 0 وقبل إرسال الأمر COMMIT، فإن محرك InnoDB يحفظ التعديلات الناقصة نهائياً على القرص.
خطأ؛ يتراجع محرك InnoDB تلقائياً عن جميع التعديلات غير المعتمدة عند انقطاع الجلسة قبل COMMIT.