Tôi đã đoạn mã sau (nhiều hơn hoặc ít hơn) để nhập khẩu bất cứ nơi nào từ 500.000 đến 4.000.000 hàng:ghi biến mất trong vòng PDO giao dịch 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();
Như bạn thấy, tôi thực hiện một cam kết mỗi 100 dòng và thậm chí tôi còn ngủ thêm chút nữa. Tôi đã từng chạy cam kết chỉ một lần mỗi 25.000 dòng, và tôi đã không sử dụng bất kỳ giấc ngủ. Tuy nhiên, tại một thời điểm, tôi phát hiện ra tôi đã mất tích hồ sơ. Tôi bắt đầu chơi với các cài đặt này (ngủ và số hàng). Bằng cách này tôi đã giảm số lượng bản ghi còn thiếu từ 50.000 xuống còn khoảng 100. Nhưng tôi vẫn thiếu hồ sơ! Họ đang đi đâu vậy? Tôi biết SQL là ok, bởi vì tôi ngay lập tức nhận được lỗi khi somethings sai ở đó.
Tôi nghĩ tôi có thể xếp chồng nhiều lần chèn trong khi giao dịch? Có thể gọi beginTransaction là một vấn đề?
UPDATE:
Các tiền thưởng đã kết thúc và tôi phải giải nó. Cảm ơn tất cả các câu trả lời của bạn. Hoặc lời khuyên thực sự, vì không ai trong số các bạn thực sự trả lời câu hỏi của tôi. Tôi đã không yêu cầu một workaround, mặc dù bạn đề xuất được nhiều đánh giá cao. Câu trả lời tiền thưởng đã được trao để nhận nó vì nó đến gần nhất để thực sự trả lời câu hỏi của tôi. Không may, nó không hoạt động.
Hiện tại tôi đang sử dụng nhập số lượng lớn CSV, hoạt động tốt, nhưng nếu có ai đó có bất kỳ mẹo nào khác để khắc phục sự cố này, vui lòng cho tôi biết. Khi tôi thích sử dụng phương pháp ban đầu của tôi.
Chạy mã mà không bắt đầuTruy cập và xếp tất cả các truy vấn chèn trong một kết quả giao dịch sẽ mất khoảng 40.000 bản ghi ... –
Nếu tôi lặp lại vòng lặp này mà không có giao dịch, nó hoạt động tốt. Không có hồ sơ nào bị mất ... –
Vấn đề không phải do PDO gây ra. Chắc chắn rồi. –