Hoewel ik nog steeds betwijfel of transacties en/of batch-inserts een haalbare oplossing zijn voor uw probleem met het gebruik van bronnen, zijn ze nog steeds een betere oplossing dan het voorbereiden van massale verklaringen zoals Dave heeft gesuggereerd.
Probeer deze eens en kijk of ze helpen.
Het volgende gaat ervan uit dat de foutafhandelingsmodus van PDO is ingesteld om uitzonderingen te genereren. Bijv.:$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Als u om de een of andere reden de uitzonderingsmodus niet kunt gebruiken, moet u de terugkeer van execute()
controleren elke keer en gooi je eigen Exception.
Enkele transactie:
$sql = $db->prepare("INSERT INTO players (name, level, vocation, world, month, today, online) VALUES (:name, :level, :vocation, :world, :time, :time, :online) ON DUPLICATE KEY UPDATE level = :level, vocation = :vocation, world = :world, month = month + :time, today = today + :time, online = :online");
$db->beginTransaction();
try {
foreach ($players as $player) {
$sql->execute([
":name" => $player->name,
":level" => $player->level,
":vocation" => $player->vocation,
":world" => $player->world,
":time" => $player->time,
":online" => $player->online
]);
}
$db->commit();
} catch( PDOException $e ) {
$db->rollBack();
// at this point you would want to implement some sort of error handling
// or potentially re-throw the exception to be handled at a higher layer
}
Gegroepeerde transacties:
$batch_size = 1000;
for( $i=0,$c=count($players); $i<$c; $i+=$batch_size ) {
$db->beginTransaction();
try {
for( $k=$i; $k<$c && $k<$i+$batch_size; $k++ ) {
$player = $players[$k];
$sql->execute([
":name" => $player->name,
":level" => $player->level,
":vocation" => $player->vocation,
":world" => $player->world,
":time" => $player->time,
":online" => $player->online
]);
}
} catch( PDOException $e ) {
$db->rollBack();
// at this point you would want to implement some sort of error handling
// or potentially re-throw the exception to be handled at a higher layer
break;
}
$db->commit();
}