记录在PDO mssql事务循环中消失

Der*_*rts 6 php sql sql-server pdo transactions

我有以下代码(或多或少)导入从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();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我每100行执行一次提交,甚至还添加了一些睡眠.我曾经每25.000行只运行一次提交,我没有使用任何睡眠.但是,有一次,我发现我丢失了记录.我开始玩这些设置(睡眠和行数).这样我将丢失记录的数量从50.000减少到大约100.但我仍然缺少记录!他们要去哪?我知道SQL没问题,因为我遇到错误时会立即收到错误.

我以为我可以在交易过程中堆叠很多插入?调用beginTransaction会有问题吗?

更新:

恩惠结束了,我不得不奖励它.谢谢大家的答案.或者实际上是提示,因为没有人真正回答过我的问题.我并不是要求解决方法,尽管您的建议非常受欢迎.得到赏金的答案是因为它最接近实际回答我的问题.不幸的是它没有用.

目前我正在使用CSV批量导入,工作正常,但如果有人有任何其他提示来解决此问题,请告诉我.因为我更喜欢使用我的原始方法.

Aar*_*mpf 1

您是否考虑过使用存储过程而不是插入语句?按顺序写入任意数量的记录(一次一个)有点浪费时间/精力..它只是没有应有的那么快。

您确定不能使用 BULK INSERT 或 XML 来一次插入多行吗?