Tengo el siguiente código (más o menos) para importar en cualquier lugar de 500.000 a 4.000.000 de filas:Records desaparecen en bucle DOP transacción mssql
$sSql = "Insert into table (a,b,c) VALUES(?,?,?)"
$oSQLStmnt = $pdo->prepare($sSql);
$oSQLStmnt->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
if (!$oSQLStmnt) {
echo $pdo->errorInfo(); // Handle errors
}
$pdo->beginTransaction();
$iLineCounter = 1;
while (($sLine = fgets ($oCSV, 8000)) !== FALSE) {
$aLine = explode('|', $sLine); //Fgetscsv did not work properly
if ($iLineCounter % 100 == 0) {
lo("Inserting row " . $iLineCounter);
$pdo->commit();
sleep(0.15);
$pdo->beginTransaction();
}
try {
$oSQLStmnt->execute($aLine);
$iSuccesulInserts++;
}
catch (exception $e) {
print_r($e);
$iFailedInserts++;
}
$iLineCounter++;
}
$pdo->commit();
Como se puede ver, realizar una confirmación cada 100 líneas , e incluso agregué algo de sueño. Solía ejecutar el commit solo una vez cada 25,000 líneas, y no usé ningún sleep. Sin embargo, en un momento dado, descubrí que me faltaban registros. Empecé a jugar con estas configuraciones (suspensión y número de filas). De esta forma, reduje la cantidad de registros perdidos de 50,000 a alrededor de 100. ¡Pero aún me faltan registros! ¿A dónde van? Sé que el SQL está bien, porque de inmediato recibo errores cuando algo anda mal allí.
Pensé que podría apilar muchas inserciones durante una transacción? ¿Podría llamar a beginTransaction ser un problema?
ACTUALIZACIÓN:
La generosidad terminó y tuve que adjudicarlo. Gracias a todos por sus respuestas o comentarios. O consejos en realidad, ya que ninguno de ustedes respondió mi pregunta. No estaba pidiendo una solución alternativa, aunque sus sugerencias son muy apreciadas. La respuesta que se otorgó a la recompensa fue recibida porque estuvo más cerca de responder mi pregunta. Desafortunadamente, no funcionó.
Por el momento estoy usando la importación masiva CSV, que funciona bien, pero si alguien tiene otros consejos para solucionar este problema, por favor hágamelo saber. Como prefiero usar mi método original.
Ejecutando el código sin comenzar la Transacción y apilando todas las consultas de inserción en una transacción resulta en la desaparición de aproximadamente 40,000 registros ... –
Si repito este ciclo sin transacciones, funciona bien. No se pierden registros ... –
El problema no está causado por PDO. Eso es seguro. –