شرح صفوف ومحتوى الفقرة
افتراضياً، تعمل قواعد البيانات بوضع الاعتماد التلقائي وتكتب للقرص بعد كل عملية INSERT؛ لذا فإن إحاطة الإدراج الجماعي بمعاملة (Transaction) يضمن الذرية ويسرّع الأداء عشرات المرات.
- ابدأ المعاملة قبل الحلقة عبر
$pdo->beginTransaction()، واعتمد التغييرات دفعة واحدة بعد انتهاء الحلقة عبر$pdo->commit(). - أحِط الحلقة بكتلة
try / catch (Throwable $e)واستدعِif ($pdo->inTransaction()) { $pdo->rollBack(); }للتراجع الكامل إذا فشل أي صف. - تنبيه مهم: استدعِ
$pdo->lastInsertId()قبل استدعاء$pdo->commit()، لأن بعض المحركات تصفر المعرف بعد الاعتماد.
تُنفذ عمليات الإدراج الثلاث داخل معاملة واحدة، ويُلتقط $lastId قبل commit()، ثم تُحفظ السجلات ذرياً دفعة واحدة.
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";