INSERTでデッドロックを回避するシェアB!PocketRailsでactiverecord-importを使ってバルクインサートをする時にDeadlockエラーが出たので対処しました。バルクインサートをする時にはINSERT順を気をつけないといけませんねという話です。...というデッドロックエラーが発生しました。INSERTのエラー原因調査ということでデッドロックの原因を調べてみたのですが、インサート順がインデックスに沿っていないことがまずかったようです。inserts)デッドロックが発生してしまうケース例えば以下のような場合にまずいことになります。PostgreSQLの本となっていて、nameカラムがUNIQUEキーになっていたとします。INSERT処理を同時に実行しようとするとデッドロックが起こる場合があります。デッドロックが発生するまでの処理内容デッドロックは以下のような処理順の場合に発生してしまいます。ギャップロックA1という感じになります。ご覧の通りプロセスAがギャップロックB1の解放を待つプロセスBがギャップロックA1の解放を待つという形でデッドロックが発生してしまいます。INSERTする時の順番を気をつければ回避できます。(NULL,'MySQLの本'),(NULL,'Railsの本');とすればOKです。ギャップロックA2という感じになって解放待ちのギャップロックを辿ってもループしなくなるのでデッドロックを回避できます。INSERTの際はINSERTの順番に気をつけましょう。(2015/01/08)おすすめブログ湘南・藤沢おすすめ情報ブログ@湘南T-SITE湘南近辺のおすすめローカル情報です業務スーパーかんたんレシピ業務スーパーを使ったおすすめ料理レシピですポケットサックス演奏動画とかブログポケットサックスに合う曲の演奏動画とかプロフィールharacane湘南から渋谷のスポーツTechベンチャーに通うエンジニアです。現在はFanForwardでチーフエンジニアしてます。設計・開発をしていました。技術分野はRuby/Railsベースのアジャイル開発、Hadoopでの大規模分散処理など。とどろきアリーナにも家族連れでよく通っています。@haracaneトップ連載記事ジャンルデータ処理RubyJekyllその他バックナンバ。