Можно ли использовать MySqlBulkLoader с транзакцией? - PullRequest
6 голосов
/ 12 февраля 2011

Можно ли использовать MySqlBulkLoader с транзакцией? Я не вижу способа явно присоединить транзакцию к экземпляру загрузчика. Есть ли другой способ?

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Как указано здесь членом команды документации MySQL:

It's not atomic.  The records loaded prior to the error will be in the
table.

Работа заключается в том, чтобы импортировать данные в выделенную таблицу и затем выполнить INSERT INTO ... SELECT ..., что будет атомарной операцией.На больших массивах данных это потенциальная проблема из-за длительной транзакции.

1 голос
/ 15 февраля 2011

Руководство MySQL указывает на то, что MySqlBulkLoader является оболочкой «LOAD DATA INFILE».Просматривая документацию «LOAD DATA INFILE», я заметил этот абзац:

Если вы укажете IGNORE, входные строки, дублирующие существующую строку с уникальным значением ключа, будут пропущены.Если вы не укажете ни один из параметров, поведение зависит от того, указано ли ключевое слово LOCAL.Без LOCAL возникает ошибка, когда обнаруживается повторяющееся значение ключа, а остальная часть текстового файла игнорируется.С LOCAL поведение по умолчанию такое же, как если бы был указан IGNORE;это связано с тем, что сервер не может остановить передачу файла в середине операции.

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

Обходной путь - импортировать данные в таблицу импорта, а затем использовать отдельную хранимую процедуру для обработки данных с использованием транзакций в нужную таблицу.

Итак, в ответе

...