MySQL+InnoDB で、単一のテーブルと、"SELECT ... FOR UPDATE" を実行する 2 つのスレッドがあるとします。両方の SELECT ステートメントが複数の行を選択することになるとします。たとえば、両方とも行 R42 と R99 を選択することになります。これがデッドロックになる可能性はありますか?
私はこの状況を考えています。最初のスレッドは R42 をロックしてから R99 をロックしようとし、2 番目のスレッドは R99 をロックしてから R42 をロックしようとします。運が悪いと、2 つのスレッドがデッドロックしてしまいます。
「デッドロック」のMySQL用語集を読みました
トランザクションが (UPDATE または SELECT ... FOR UPDATE などのステートメントを使用して) 複数のテーブルの行をロックすると、デッドロックが発生する可能性がありますが、その順序は逆です。...
デッドロックの可能性を減らすには、 ... SELECT ... FOR UPDATE および UPDATE ... WHERE ステートメントで使用される列にインデックスを作成します。
これは、私の状況 (単一のテーブル) ではデッドロックしないことを示唆しています。これは、MySQL が主キーの順序で行を自動的にロックしようとするためかもしれませんが、確実にしたいのですが、何が起こっているかを正確に教えてくれるドキュメント。