Записи исчезают в цикле транзакций PDO mssql

У меня есть следующий код (более или менее )для импорта от 500 000 до 4 000 000 строк:

$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();

Как видите, я выполняю коммит каждые 100 строк и даже добавил немного сна. Раньше я запускал коммит только один раз каждые 25 000 строк и не использовал сон. Однако в какой-то момент я обнаружил, что мне не хватает записей. Я начал играться с этими настройками (сон и количество строк ). Таким образом, я уменьшил количество отсутствующих записей с 50 000 до примерно 100. Но я все еще пропускаю записи! Куда они идут? Я знаю, что с SQL все в порядке, потому что я немедленно получаю ошибки, когда что-то не так.

Я думал, что могу складывать много вставок во время транзакции? Может ли вызов beginTransaction быть проблемой?

ОБНОВЛЕНИЕ:

Награда закончилась, и мне пришлось ее присудить. Спасибо всем за ваши ответы. Или советы на самом деле, поскольку никто из вас на самом деле не ответил на мой вопрос. Я не просил обходной путь, хотя ваши предложения очень ценятся. Ответ, за который была присуждена награда, получил его, потому что он был ближе всего к фактическому ответу на мой вопрос. К сожалению, это не сработало.

На данный момент я использую массовый импорт CSV, который отлично работает, но если у кого-то есть другие советы по устранению этой проблемы, сообщите мне. Поскольку я предпочитаю использовать свой оригинальный метод.

6
задан Derk Arts 12 July 2012 в 07:25
поделиться