同一テーブルに対してinsertする2つのトランザクションがデッドロックした


Teradataで、あるテーブルに対して複数行insertするジョブを並行して走らせたところ、デッドロックしてしまった。
Teradataの場合、insertのデフォルトのロックはテーブルロックだと思っていたのだがこれが間違いで、実は行ハッシュロックというのが掛けられる。
行ハッシュロックは、行のPI(Primary Index. Teradataのテーブルには必須のインデックス)から算出したハッシュキーを対象とするロックで、Teradataはこのハッシュキーに基づいてデータの物理的な格納位置を決定する。
行ハッシュロックとは、要するに行の格納位置を単位とするロックなわけだ。
なので、insertするPIの値によっては

という順にロックを取ろうとするので、デッドロックすることがある。