MySQL: شرح مفصل لمعاملات MySQL وخصائص ACID

آخر تحديث: 2026-08-26

تضمن المعاملات «الوحدوية» لعمليات البيانات — فهي إما تنجح بالكامل أو تفشل بالكامل.

يشرح هذا الدرس مبادئ المعاملات وكيفية استخدامها.

100%
graph TB
    A[START TRANSACTION] --> B[ExecuteSQLOperation]
    B --> C{Was it successful??}
    C -->|All successful| D[COMMIT]
    C -->|Partial failure| E[ROLLBACK]
    B --> F[SAVEPOINT Save Point]
    F --> G[ROLLBACK TO sp]
    G --> B
    D --> H[Data Persistence]
    E --> I[Data Restored to Before Transaction]

1. ما ستتعلمه



2. قصة حقيقية عن تحويل مصرفي

(1) المشكلة: فشل عملية النقل في منتصف الطريق

يقوم «أ» بتحويل مبلغ 100 يوان إلى «ب»:

SQL
UPDATE accounts SET balance = balance - 100 WHERE id = 1;  -- Success
-- At this point, the system crashes
UPDATE accounts SET balance = balance + 100 WHERE id = 2;  -- Not executed

النتيجة: كان لدى «أ» عجز قدره 100، ولم يتلقَ «ب» أي شيء — فقد اختفى المال في الهواء.

(2) حلول المعاملات

SQL
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;  -- Submit only if both are successful


3. خصائص ACID

الميزة الوصف التنفيذ
التجزئة المعاملة هي وحدة عمل غير قابلة للتجزئة سجل التراجع
التناسق تظل البيانات متسقة قبل المعاملة وبعدها طبقة التطبيق + القيود
العزل لا تتداخل المعاملات المتزامنة مع بعضها البعض الأقفال + MVCC
المتانة يتم تخزين البيانات بشكل دائم بعد الإرسال سجل الإعادة


4. عمليات المعاملات

▶ مثال: المعاملات الأساسية

SQL
-- Start Transaction
START TRANSACTION;

-- Perform an operation
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- Commit Transaction
COMMIT;

-- Or roll back the transaction
ROLLBACK;
▶ جرّب الكود

▶ مثال: SAVEPOINT

SQL
START TRANSACTION;

INSERT INTO orders (customer_id, amount) VALUES (1, 100);
SAVEPOINT sp1;

INSERT INTO order_items (order_id, product_id) VALUES (LAST_INSERT_ID(), 1);
SAVEPOINT sp2;

-- Roll back to sp1(Retain the first item INSERT)
ROLLBACK TO sp1;

-- Submit(Keep only the first one INSERT)
COMMIT;
▶ جرّب الكود

5. الإرسال التلقائي

▶ مثال: AUTOCOMMIT

SQL
-- View Auto-Submit Status
SELECT @@autocommit;

-- Turn off Auto-Submit
SET autocommit = 0;

-- Enable Auto-Submit
SET autocommit = 1;
▶ جرّب الكود
autocommit الوصف
1 (الافتراضي) التثبيت التلقائي لكل عبارة
0 يتطلب إجراء «COMMIT» يدويًا


6. مستويات عزل المعاملات

مستوى العزل القراءة غير النظيفة القراءة غير القابلة للتكرار القراءة الوهمية الأداء
قراءة غير ملزمة الأفضل
قراءة ملتزمة عالي
قراءة قابلة للتكرار (الافتراضي) متوسط
قابل للتسلسل الأدنى

▶ مثال: ضبط مستوى العزل

SQL
-- View the current isolation level
SELECT @@transaction_isolation;

-- Set the isolation level
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
▶ جرّب الكود

7. توضيح مشكلات التزامن

(1) القراءة غير الدقيقة

SQL
-- Transaction A
START TRANSACTION;
UPDATE accounts SET balance = 1000 WHERE id = 1;
-- Not committed

-- Transaction B (READ UNCOMMITTED)
SELECT balance FROM accounts WHERE id = 1;  -- Read 1000 (Dirty Data)

-- Transaction A
ROLLBACK;  -- Rollback

-- Transaction B: data read is now invalid

(2) القراءات غير القابلة للتكرار

SQL
-- Transaction A
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1;  -- Read 500

-- Transaction B
UPDATE accounts SET balance = 1000 WHERE id = 1;
COMMIT;

-- Transaction A
SELECT balance FROM accounts WHERE id = 1;  -- Read 1000 (Inconsistent)
COMMIT;


❓ أسئلة شائعة

س ما هو مستوى العزل الافتراضي في MySQL؟
ج REPEATABLE READ، ويتم تنفيذه باستخدام MVCC + أقفال الفجوة.
س ماذا يحدث إذا لم يتم تثبيت المعاملة؟
ج يظل القفل ساريًا، وقد تنتهي مهلة المعاملات الأخرى أثناء انتظارها.
س هل يمكن التراجع عن أوامر DDL؟
ج لا، يتم تثبيت أوامر DDL تلقائيًا ولا يمكن التراجع عنها.
س ما معنى «التثبيت الضمني»؟
ج عند تنفيذ أوامر DDL (CREATE/ALTER/DROP)، يتم تثبيت المعاملة الحالية تلقائيًا؛ وهذا ما يُعرف بالتثبيت الضمني.
س ما هي المخاطر المرتبطة بالمعاملات الكبيرة؟
ج فترات قفل طويلة، وتضخم سجل التراجع، وزيادة زمن الاستجابة بين الخادم الرئيسي والخادم التابع. يُنصح بتقسيمها إلى معاملات أصغر.

📖 ملخص


📝 تمارين

  1. المسألة الأساسية (مستوى الصعوبة: ⭐): اكتب معاملة تنقل مبلغ 100 من الحساب «أ» إلى الحساب «ب».

  2. مشكلة متقدمة (درجة الصعوبة ⭐⭐): استخدم الأمر SAVEPOINT لتنفيذ عملية التراجع الجزئي.

  3. سؤال التحدي (مستوى الصعوبة: ⭐⭐⭐): اشرح مشكلة القراءة غير القابلة للتكرار وحلها باستخدام مستوى العزل «القراءة القابلة للتكرار» (REPEATABLE READ).

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%