MySqlBulkLoaderをトランザクションで使用できますか?ローダーのインスタンスにトランザクションを明示的にアタッチする方法がわかりません。別の方法はありますか?
2 に答える
MySQLのマニュアルには、MySqlBulkLoaderが「LOADDATAINFILE」のラッパーであることが示されています。'LOAD DATA INFILE'のドキュメントを見ていると、次の段落に気づきました。
IGNOREを指定すると、一意のキー値で既存の行を複製する入力行はスキップされます。どちらのオプションも指定しない場合、動作はLOCALキーワードが指定されているかどうかによって異なります。LOCALがないと、重複するキー値が見つかったときにエラーが発生し、残りのテキストファイルは無視されます。LOCALの場合、デフォルトの動作はIGNOREが指定されている場合と同じです。これは、サーバーが操作の途中でファイルの送信を停止する方法がないためです。
取引についての議論は見つかりませんでしたが、上記の段落は取引が不可能であることを示しています。
回避策は、データをインポートテーブルにインポートしてから、別のストアドプロシージャを使用して、トランザクションを使用して目的のテーブルにデータを処理することです。
だから答えに
MySQLドキュメントチームのメンバーがここで述べているように:
It's not atomic. The records loaded prior to the error will be in the
table.
回避策は、データを専用テーブルにインポートしてから実行するINSERT INTO ... SELECT ...
ことです。これはアトミック操作になります。巨大なデータセットでは、トランザクションが長いため、これは潜在的な問題です。