Sto usando le transazioni per fare inserimenti / aggiornamenti in blocco. Questo è il mio piccolo ciclo di test:
$now = date('Y-m-d H:i:s');
for ($i=0; $i<60; $i++) {
$db->insert($cfg['ps_manufacturer'], array(
'reference' => 'MF'.$i,
'name' => 'MF NAME'.$i,
'date_add' => $now,
'date_upd' => $now,
'active' => true,
));
echo $db->lastInsertId().'<br>';
}
Ora lo script sopra è ovviamente molto lento perché la query è in loop. Utilizzando le transazioni il tempo di esecuzione scende da 2s
a 0.06s
:
$db->beginTransaction();
$now = date('Y-m-d H:i:s');
for ($i=0; $i<60; $i++) {
$db->insert($cfg['ps_manufacturer'], array(
'reference' => 'MF'.$i,
'name' => 'MF NAME'.$i,
'date_add' => $now,
'date_upd' => $now,
'active' => true,
));
echo $db->lastInsertId().'<br>';
}
$db->commit();
Ora, ciò che mi confonde è come fa il secondo campione a restituire immediatamente un ID di ogni riga inserita? Dalla mia comprensione la transazione inizia e accoda tutte le procedure, finché la coda non viene "rilasciata" utilizzando commit()
.
Ora ovviamente il test ha dimostrato che ho torto, qualcuno potrebbe spiegare come funziona? Fa essenzialmente lo stesso, ma funziona molto più velocemente. L'utilizzo delle transazioni avvia una sorta di "sessione procedurale" ottimizzata per le continue interrogazioni? Questo codice è un po 'contro-intuitivo per me, sembra quasi una programmazione asincrona:)