أساسيات المعاملات في MySQL: دليل ACID الكامل والتسليم والالتزام التلقائي

آخر تحديث: 11/05/2025
نبذة عن الكاتب: ج مصدر تريل
  • يوفر InnoDB معاملات حمضية وحظرًا للملف وقراءة متكررة للخلل.
  • Controla autocommit, START TRANSACTION, COMMIT/ROLLBACK y SAVEPOINT para atomicidad real.
  • قم بتعديل مستويات التسامح والأنماط للقراءة فقط/القراءة والكتابة مع مجموعة المعاملات.
  • تجنب الأغاني، لا يوجد تكرار، وتخيلات متوازنة في الاتساق والأداء.

معاملات MySQL

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

بالإضافة إلى الأوامر الأساسية مثل ذلك بدء المعاملة، الالتزام والتراجع, veremos el papel de الالتزام التلقائي، و niveles de aislamiento ACID, أقفال, نقاط حفظ, modos de acceso y مجموعة المعاملات. تتضمن أيضًا الأمثلة على خطوات حل مشكلات التزامن النموذجية، والملاحظات حول InnoDB مقابل MyISAMكيفية إدارة المعاملات من هذا القبيل PHP (MySQL) و الإجراءات المخزنة، بالإضافة إلى بطارية للحالات العملية التي يمكنك تعلمها. إذا كنت تقوم بإعداد DAW أو DAM أو ASIR، فسوف يأتي هؤلاء الرفاق كما لو كانوا على الأرض.

Apuntes de BD para DAW, DAM y ASIR — دورة 2025/2026. تجمع هذه المادة بين أفضل الممارسات والنظرية الرئيسية ما تحتاجه هو السيطرة على المعاملات في MySQL بشكل احترافي.

مذكرة: لقد تم التبرع بالمال لنا للحفاظ على موقع الويب الخاص بنا، وكذلك لإنشاء أفضل محتوى. شكرًا لك على مساعدتك في متابعة إرشادات التقنيات المفيدة واليومية.

ما هي معاملة وما هو مهم

Una transacción es una unidad lógica de trabajo قم بجمع جمل مختلفة بالشكل الذي تريده سواء تم تطبيقه على الإطلاق، أو لم يتم تطبيقه على الإطلاق. يتجنب هذا الحالات غير المتسقة، خاصة في العمليات الحاسوبية التي يمكنك من خلالها تغيير الجداول أو الملفات. Piensa en un traspaso entre cuentasbancarias: se descuenta de la cuenta Origine y se abona en la destino؛ إذا فشلت إحدى الإجراءات، فلا يمكنك السماح بتأكيد شيء آخر فقط.

MySQL, con el motor ك InnoDB, تنفيذ المعاملات حسب النموذج حمض، توفير ضمانات التكامل الصلبة بما في ذلك قبل سقوط النظام أو قطع الضوء. إذا كنت تعيش في SGBD أخرى، فسوف تشعر وكأنك في منزلك: المفاهيم الأساسية هي نفسها.

حمض Propiedades: ضمانات رباعية

  • الذرية: الكتلة تعمل بشكل غير قابل للتجزئة؛ س كل شيء موافق يا لا شيء. إذا فشلت العملية، فسيتم الرجوع إلى كل المجموعة.
  • اتساق: كل ​​معاملة تفتح قاعدة البيانات الخاصة بحالة صالحة لآخر. لا يوجد أي قيود على الأعمال الضعيفة أو البيانات المستحيلة.
  • العزل: ما يحدث في إحدى المعاملات لا ينبغي التدخل ولا الآية المؤثرة من أجل الآخرين الذين يتم تنفيذهم بالتوازي، حسب المستوى الأنيق.
  • متانة: una vez haces COMMIT, التغييرات المستمرة incluso ante fallos.

InnoDB vs MyISAM: المحرك موجود

En MySQL existen varios محركات التخزين. يدعم Solo InnoDB المعاملات والكلمات الرئيسية; كما توفر حجبًا لمستوى الأسرة والتعافي قبل السقوط. MyISAM لا يدعم المعاملات وإعطاء الأولوية للسرعة المتعلقة بالاتساق، وهو ما يعد مفيدًا للعديد من سيناريوهات المحاضرة المكثفة، ولكن إنه ليس كافيًا عندما يحتاج إلى حمض.

الالتزام التلقائي: ما هو تأثير ذلك

MySQL tiene el modo الالتزام التلقائي يتم تنشيطه بسبب الخلل. هذا يعني أنه سيتم إجراء معاملة واضحة، يتم تأكيد كل جملة DML تلقائيًا como si estuviese envuelta por START TRANSACTION y COMMIT. Si la sentencia falla, se revierte automáticamente هذه نية، ولكن إذا كنت ناجحًا، فلن تتمكن من التفكيك يدويًا ROLLBACK.

عندما تبدأ معاملة تجارية START TRANSACTION, يقوم MySQL بإلغاء تنشيط الالتزام التلقائي مؤقتًا حتى يحدث ذلك COMMIT o ROLLBACK. يمكنك تغيير الالتزام التلقائي إلى مستوى الجلسة SET:

-- Ver el valor actual
SELECT @@autocommit;

-- Desactivar autocommit en la sesión actual
SET autocommit = 0;

-- Activarlo de nuevo
SET autocommit = 1;

بعد إلغاء تفعيل الالتزام التلقائي, لا توجد تغييرات دائمة حتى يتم تنفيذها COMMIT; si quieres descartarlos, الولايات المتحدة الأمريكية ROLLBACK. عشرة على الأقل أن هذا التكوين يتم من خلال الجلسة و تتم إعادة تعيينه عند إغلاق الاتصال.

القواعد الأساسية: بدء المعاملة والالتزام والتراجع

El ciclo típico es: بدء المعاملة وتنفيذ عمليات DML وتأكيد الإزالة اتبع النتيجة. أنت بلا عيب مثل ذلك BEGIN o BEGIN WORK para iniciar, y COMMIT/ROLLBACK para finalizar:

START TRANSACTION;
  UPDATE cuentas SET saldo = saldo - 100 WHERE id = 20;
  UPDATE cuentas SET saldo = saldo + 100 WHERE id = 30;
COMMIT; -- o ROLLBACK si algo fue mal

إذا كان النظام موجودًا بين النظامين UPDATE أو إذا قمت بإيقاف الاتصال من خلال إلغاء تنشيط التنفيذ التلقائي، يضمن InnoDB عدم تأكيد المعاملة غير المكتملة. في حالة عدم وجود حسابات أو قيود (ص. على سبيل المثال، CHECK de saldo no negativo) falla, la transacción se revierte وهذا هو الأساس كالمبدأ.

نقاط الحفظ: التحكم في النهاية داخل المعاملة

مع SAVEPOINT إنشاء نقاط استرداد في إحدى المعاملات لتتمكن من ذلك deshacer parcialmente sin tirar todo el trabajo:

START TRANSACTION;
  UPDATE productos SET stock = stock - 2 WHERE id = 10;
  SAVEPOINT p1;
  UPDATE productos SET stock = stock - 5 WHERE id = 11;
  -- Si falla lo siguiente, solo deshacemos hasta p1
  ROLLBACK TO SAVEPOINT p1;
  -- Seguimos con otras operaciones
RELEASE SAVEPOINT p1;
COMMIT;

يحدد Si varios SAVEPOINT بنفس الاسمتعتبر MySQL النهاية. يمكن أن يكون كذلك eliminarlos con RELEASE SAVEPOINT للحفاظ على نظافة المعاملة.

مستويات التسليم: التوازن بين الاتساق والأداء

القيمة المعيبة في MySQL es REPEATABLE READ، والتي تقدم محاضرات متماسكة في نفس المعاملة بفضل التحويل المتعدد (MVCC).

مشاكل التزامن الكلاسيكية que queremos acotar:

  • Lectura sucia (Dirty Read): اقرأ تغييرات المعاملات الأخرى التي لم يحدث لها مثيل COMMIT.
  • Lectura no repetible: تعلم نفس الشيء في كل مرة واحصل على قيم مختلفة actualizaciones confirmadas من المعاملات الأخرى بين السفراء والمحاضرات.
  • Lectura fantasma:قم بتشغيل نفس الاستشارة y que aparezcan filas nuevas يجب أن يتم تأكيد الإدخالات من خلال معاملة أخرى.

Comportamiento por Nivel (السيرة الذاتية العملية): READ UNCOMMITTED permite las tres anomalías; READ COMMITTED evita lecturas sucias لكن لا يمكنك أن تتخيل أي تكرارات أو تخيلات؛ REPEATABLE READ evita sucias y no repetibles وبشكل عام، أعترف منفردًا بالاحتمالات "الخيالية"؛ SERIALIZABLE يتم حظره كما لو كان يتم تنفيذه بشكل متسلسل, إزالة الثلاثة أضعاف تكلفة الحظر الأكبر.

-- Consultar nivel de aislamiento (sesión y global)
SELECT @@transaction_isolation;     -- sesión
SELECT @@global.transaction_isolation; -- global

يمكنك تعديل التسليم من خلال المعاملة أو الجلسة أو عالميًا. أذكر أن التغييرات العالمية تؤثر على اتصالات جديدة, no a las existentes.

الكتل والمحاضرات مع الحظر

Para mantener el aislamiento, el motor usa bloqueos (locking). InnoDB يحجب بسبب الخلل أ مستوى الفيلا، مما يسمح لك بالتزامن مع الحظر على اللوحة. الحظر يمنع المعاملات الأخرى من إجراء أو تغيير البيانات باستخدامها Mientras la tuya no haya Finalizado.

Según el Level y la Operation، قد يتطلب MySQL كتلًا للقراءة أو الكتابة. على سبيل المثال ، SERIALIZABLE مع إلغاء التنشيط التلقائي، يتم تحويل المحاضرات إلى حواجز لإعادة الاتساق. الهدف هو تجنب أن يتم إجراء معاملة أخرى باستخدام "لحظة" بياناتك.

طرق الوصول: القراءة والكتابة والقراءة فقط

يمكن الإعلان عن المعاملات بطريقة صحيحة READ WRITE (افتراضي) أو READ ONLY. En modo solo lectura, no se permiten cambios حول الجداول، وهي مفيدة لإعلام الشركات القابلة للاستنساخ والمؤسسات.

-- Establecer modo de acceso al iniciar
START TRANSACTION READ ONLY;
-- o
START TRANSACTION READ WRITE;

También puedes fijarlo con SET TRANSACTION، مدمج مع مستوى الإسلام والمستوى مجال من التطبيق.

ضبط المعاملة: التسليم والوصول والطموحات (الجلسة، العالمية)

جملة او حكم على SET TRANSACTION يتيح لك تحديد مستوى التسليم وطريقة الوصول إليه próxima transacción، لكامل جلسة او الطريق شامل:

-- Aplica a la próxima transacción (si no indicas ámbito)
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ ONLY;

-- Aplica a todas las transacciones de esta sesión actual
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE;

-- Aplica a sesiones futuras (no a las existentes)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

Este control fino te permite موازنة القدرة والأداء حسب حالة الاستخدام، من تحليلات الشحنات بتزامن عالي OLTP.

أمثلة المتزامنة: قراءة متسخة، غير متكررة، وفانتازما

Dirty Read (lectura sucia): معاملة B ذات قيم لم يتم تأكيدها بواسطة A. Con READ UNCOMMITTED esto es posible; con READ COMMITTED en adelante, no.

-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1;
-- (sin COMMIT todavía)

-- Terminal B
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT saldo FROM cuentas WHERE id = 1; -- puede ver el saldo "sucio"

-- Terminal A
ROLLBACK; -- los cambios se deshacen

Lectura no repetible: B أكد تحديثًا بين قراءات A. Con REPEATABLE READ lo evitas; con READ COMMITTED puede ocurrir.

-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT saldo FROM cuentas WHERE id = 1; -- lectura 1

-- Terminal B (otra sesión)
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1;
COMMIT;

-- Terminal A
SELECT saldo FROM cuentas WHERE id = 1; -- lectura 2 (puede diferir)
ROLLBACK;

Lectura fantasma: بين الاستشارة التي تقوم بجمع البيانات، يتم إدراج معاملة أخرى في ملف يتم إدخاله في الفلتر. Con SERIALIZABLE se evita a costa de más bloqueos.

-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT SUM(saldo) FROM cuentas;

-- Terminal B
INSERT INTO cuentas(id, saldo) VALUES (4, 3000);
COMMIT;

-- Terminal A
SELECT SUM(saldo) FROM cuentas; -- puede observar un "fantasma"
ROLLBACK;

DML الأساسية والكلمات الرئيسية: التأثيرات عند الحذف / عند التحديث

El DML agrupa تحديد، إدراج، تحديث وحذف. من خلال تحديد الفئات الرئيسية في InnoDB، يمكنك العثور على السلوك قبل الأخطاء/التحسينات في اللوحة المرجعية:

  • RESTRICT: منع حذف/تحديث أي مراجع. هذه هي القيمة المعيبة في MySQL.
  • CASCADE: نشر العمل على الأبناء.
  • SET NULL: pone el valor a NULL en las filas hijas.
  • NO ACTION: المكافئ أ RESTRICT في MySQL.
  • SET DEFAULT: غير متوفر مع InnoDB في MySQL.

Estas reglas son clave para مرجعي ثابت وتخلص من البيانات المزعجة أثناء العمل من خلال معاملات وعلاقات كاملة.

المعاملات من PHP (mysqli): الالتزام التلقائي والالتزام والتراجع

Si programas en PHP con mysqliيمكنك التحكم في المعاملات بشكل سلس. إلغاء الاشتراك التلقائي، قم بتنفيذ استشاراتك وتأكيد الرجوع إلى النتيجة:

$db = new mysqli("localhost", "root", "pass", "database");
$db->autocommit(false);

try {
  $db->query("INSERT INTO users (name) VALUES ('marcus')");
  $db->query("UPDATE users SET name = 'jane' WHERE id = 39");
  $db->commit();
} catch (Throwable $e) {
  $db->rollback();
  // log del error
}

مع هذا النمط، si cualquier Sentencia Falla، haces rollback() y evitas inconsistencias. Luego ya تقرر إعادة الاتصال أو الإشعارات أو أي إجراء آخر.

تم تحسين الإجراءات ومعالجة الأخطاء في MySQL

يمكن الإعلان عن إجراءات MySQL المخزنة manejadores de errores إلى SQLEXCEPTION y SQLWARNING، لهذا السبب ينفذ ROLLBACK تلقائيا ante fallos:

DELIMITER //
CREATE PROCEDURE transferir(IN p_origen INT, IN p_destino INT, IN p_importe DECIMAL(10,2))
BEGIN
  DECLARE exit handler FOR SQLEXCEPTION
  BEGIN
    ROLLBACK;
  END;

  START TRANSACTION;
    UPDATE cuentas SET saldo = saldo - p_importe WHERE id = p_origen;
    UPDATE cuentas SET saldo = saldo + p_importe WHERE id = p_destino;
  COMMIT;
END //
DELIMITER ;

يمكنك أيضًا استخدام أداة واحدة مشتركة لأنواع مختلفة من الأخطاء إذا كنت أفضل. الهدف هو مركزية الإرجاع وإلغاء تحديد القاعدة cuando algo no va bien.

الحالات العملية المقترحة: لتجربتها

Tienda de informática

  • Inserta fabricantes indicando código y nombre؛ y también Solo con nombre.
  • Inserta productos المرتبطون بالمصنعين مع مجموعات مختلفة من الأعمدة (مع وبدون كود).
  • Crea la tabla fabricante_productos مع أعمدة nombre_fabricante, nombre_producto, precio e أدخل واحدًا فقط في جميع السجلات من tienda.
  • Crea la vista vista_fabricante_productos مع ثلاثة أعمدة سابقة.
  • إزالة المصنعين كما Asus o Xiaomi ولماذا لا يمكن أن يكون ممكنا؛ ajusta claves foráneas (ص. على سبيل المثال، ON DELETE) si hace falta.
  • Actualiza códigos de fabricantes (Lenovo أ 20 ، Huawei أ 30) وتحليل القيود المرجعية الضرورية.
  • Actualiza precios مجموع 5 يورو لجميع المنتجات؛ elimina impresoras con precio < 200 €.

العاملين

  • Inserta departamentos مع مجموعات مختلفة من الأعمدة (con y sin código، con Gastos).
  • Inserta empleados vinculados a Departamentos (مع وبدون كود صريح).
  • Crea y rellena departamento_backup من departamento.
  • إزالة الإدارات (Proyectos, Desarrollo) y justifica si se puede o no; ضبط الوقت اللازم ليكون ضروريا.
  • Actualiza códigos (على سبيل المثال، Recursos Humanos في 30؛ Publicidad أ 40) تقييم التأثير المرجعي.
  • Incrementa presupuestos +50.000 يورو منفردًا للأقل من 20.000 يورو.
  • عملية: حذف الموظفين بدون قسم مرتبط بضمان الاتساق.

بستنة

  • Inserta oficina en Almería وممثل مبيعات.
  • Inserta cliente البحر التجاري هو المبنى الأمامي; crea un pedido con al menos dos productos.
  • تحديث كود العميل والتحقق من التغييرات في الجداول ذات الصلة؛ احذفه ومراجعة التأثيرات؛ إذا لم يكن هناك شلالات القش ، تكوين ON DELETE CASCADE.
  • القضاء على العملاء sin pedidos; sube un 20% سعر المنتجات بدون أطفال؛ بورا باغوس العميل بحد أدنى من الائتمان.
  • Ajusta límite de crédito 0 للعملاء مع وحدات أقل من المنتج 11679.
  • Modifica la tabla detalle_pedido añadiendo campo iva; وسط معاملة تجارية 18 a pedidos desde enero 2009 y 21 لبقية.
  • يضيف حقل total_linea y calcula con precio_unidad*cantidad*(1 + (iva/100)) para todos los registros.
  • Borra el cliente مع الحد الأدنى من الائتمان: تقييم ما إذا كان بإمكانك استشارة فقط ولماذا.
  • Inserta oficina en Granada con tres comerciales y ثلاثة عملاء مترابطون؛ صفقة Para un pedido porcliente con dosproductos cada uno؛ borra un cliente وضبط فوراني إذا لم يكن هناك سلسلة؛ صفقة للمسجل مدفوعات هذه الطلبات.

Ensayo adicional útil: محاكاة فقدان الاتصال SET AUTOCOMMIT = 0، قم بإغلاق الجلسة قبل الانتهاء وإعادة الاتصال لمعرفة ما الذي استمر وما لم يحدث ذلك. هذا يعزز مفهوم المتانة والذرية.

المقارنة السريعة مع SQL Server وOracle

Los conceptos son homólogos: بدء/بدء المعاملة, ارتكب, رول باك y مستويات العزلة. يوجد SQL Server بمستويات مختلفة مثل لمحةأن تقديم رؤية متسقة في بداية المعاملة بدون حظر tanto como SERIALIZABLE. توفر أوراكل مجموعة مماثلة من المستويات؛ في الممارسة العملية، يتم تغيير "اللهجة" لكن الموسيقى هي نفس الشيء: ابحث عن النقطة المثالية بين التسليم والأداء.

أسئلة نموذجية للامتحان/المراجعة

  • ¿Qué son laspropiedades ACID? Defínelas y pon un ejemplo.
  • هناك ثلاث مشكلات متزامنة وكيف نخفف من مستوى الإسلام؟
  • ما هو مستوى الخلل في InnoDB؟ قراءة قابلة للتكرار.
  • هل يمكن إجراء المعاملات مع MyISAM؟ لا، ليس هناك حاجة إلى InnoDB.
  • الفرق بين InnoDB و MyISAM: المعاملات، والأزواج، وحظر الأسرة، والاسترداد، وما إلى ذلك.
  • التحويلات المصرفية: ¿qué pasa si falla una UPDATE الوسائط أو إذا كان الحساب غير موجود؟ الرد: التراجع asegura تناسق.

يُقصد بالسيطرة على المعاملات في MySQL كيفية دمجها ACID والالتزام التلقائي والتسليم والحظر ونقاط الحفظ وأنماط الوصول لحماية بياناتك دون التأثير على الأداء. كون إنودب, تحتوي على أدوات للعمليات الكاملة (الدفع، الطلبات، المخزون) إذا كنت تشعر كأنك تعمل بشكل آمن. أجستا مجموعة المعاملات al caso de uso, apóyate en الإجراءات والتحكم في الأخطاء، وممارسة مع الحالات المقترحة: يتم ملاحظة دليل الجودة في أنظمةك.

رؤية عامة لأنظمة تخزين البيانات
المادة ذات الصلة:
الرؤية العامة لأنظمة تخزين البيانات
الوظائف ذات الصلة: