MySQL: شرح مفصل لمعاملات MySQL وخصائص ACID
آخر تحديث: 2026-08-26
تضمن المعاملات «الوحدوية» لعمليات البيانات — فهي إما تنجح بالكامل أو تفشل بالكامل.
يشرح هذا الدرس مبادئ المعاملات وكيفية استخدامها.
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. ما ستتعلمه
- خصائص ACID للمعاملات
- بدء المعاملة / التثبيت / التراجع
- SAVEPOINT نقطة حفظ
- الالتزام التلقائي (AUTOCOMMIT)
- مستويات عزل المعاملات
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)، يتم تثبيت المعاملة الحالية تلقائيًا؛ وهذا ما يُعرف بالتثبيت الضمني.
س ما هي المخاطر المرتبطة بالمعاملات الكبيرة؟
ج فترات قفل طويلة، وتضخم سجل التراجع، وزيادة زمن الاستجابة بين الخادم الرئيسي والخادم التابع. يُنصح بتقسيمها إلى معاملات أصغر.
📖 ملخص
- المعاملات تضمن تكاملية العمليات؛ فهي إما تنجح بالكامل أو تفشل بالكامل.
- ACID: الترابطية، الاتساق، العزل، الاستمرارية
- COMMIT: تنفيذ التغييرات، ROLLBACK: التراجع عن التغييرات، SAVEPOINT: نقطة حفظ
- مستويات العزل تتحكم في مشكلات التزامن: القراءات غير النظيفة، والقراءات غير القابلة للتكرار، والقراءات الوهمية
- الإعداد الافتراضي في MySQL هو REPEATABLE READ
📝 تمارين
-
المسألة الأساسية (مستوى الصعوبة: ⭐): اكتب معاملة تنقل مبلغ 100 من الحساب «أ» إلى الحساب «ب».
-
مشكلة متقدمة (درجة الصعوبة ⭐⭐): استخدم الأمر SAVEPOINT لتنفيذ عملية التراجع الجزئي.
-
سؤال التحدي (مستوى الصعوبة: ⭐⭐⭐): اشرح مشكلة القراءة غير القابلة للتكرار وحلها باستخدام مستوى العزل «القراءة القابلة للتكرار» (REPEATABLE READ).