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

Wrapping Batch Inserts in a Transaction تسريع الإدراج المتعدد داخل معاملة Transaction

أدرج السجلات المفردة والمتعددة في MySQL عبر الاستعلامات المحضرة، واسترجع المعرف التلقائي بـ lastInsertId وعالج القيم المكررة.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

افتراضياً، تعمل قواعد البيانات بوضع الاعتماد التلقائي وتكتب للقرص بعد كل عملية INSERT؛ لذا فإن إحاطة الإدراج الجماعي بمعاملة (Transaction) يضمن الذرية ويسرّع الأداء عشرات المرات.

  • ابدأ المعاملة قبل الحلقة عبر $pdo->beginTransaction()، واعتمد التغييرات دفعة واحدة بعد انتهاء الحلقة عبر $pdo->commit().
  • أحِط الحلقة بكتلة try / catch (Throwable $e) واستدعِ if ($pdo->inTransaction()) { $pdo->rollBack(); } للتراجع الكامل إذا فشل أي صف.
  • تنبيه مهم: استدعِ $pdo->lastInsertId() قبل استدعاء $pdo->commit()، لأن بعض المحركات تصفر المعرف بعد الاعتماد.

تُنفذ عمليات الإدراج الثلاث داخل معاملة واحدة، ويُلتقط $lastId قبل commit()، ثم تُحفظ السجلات ذرياً دفعة واحدة.

مخطط تدفق التنفيذ العملي لقسم تسريع الإدراج المتعدد داخل معاملة Transaction في لغة PHP
PHP
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE items (id INTEGER PRIMARY KEY, code TEXT NOT NULL)');
$pdo->beginTransaction();
$stmt = $pdo->prepare('INSERT INTO items (code) VALUES (:code)');
foreach (['A-10', 'B-20', 'C-30'] as $c) {
    $stmt->execute(['code' => $c]);
}
$lastId = (int) $pdo->lastInsertId();
$pdo->commit();
echo "Batch committed! Last ID: $lastId\n";