InnoDBのデッドロック検出と自動ロールバックを無効にしたいのですが、innodb_lock_wait_timeout
に依存したいという要件に従っています(同時実行性が高いため)。
InnoDBがデッドロックを直ちに検出し、デッドロックされたトランザクションの1つをロールバックするため、
innodb_deadlock_detect
が有効(デフォルト)の場合、ロック待機タイムアウト値はデッドロックには適用されません。innodb_deadlock_detect
が無効になっている場合、InnoDBはトランザクションのロールバックのためにinnodb_lock_wait_timeout
に依存します[...]
MySQL 5.7.13で上記をどのように実現できますか?変数innodb_deadlock_detect
が見つかりませんでした。
はい、できます。 innodb_lock_wait_timeout
かなり低く、たとえば2秒。 2秒間続くデッドロックは、まれである場合(そして通常は非常にまれ)、完全に無害です。長いトランザクションを避け、外部キーを避けるように開発者に注意してくださいON ... CASCADE
(ロックを伝播するため、デッドロックが発生する可能性が高くなります)。
もちろん、私はあなたがそれらのタイムアウトの非常に低い値を保つことができると仮定しています。しかし、あなたはできますか?ワークロードはわかりませんが、たとえば、ステートメントが1時間ごとに10秒間、一部の行をロックする場合があります。そのような場合、タイムアウトを短くすることはできますか?そうでなければ、私が上に書いたすべてがあなたには当てはまりません。
それが可能であっても、おそらく賢明ではありません。
デッドロックの可能性が発生するたびに、それを50秒間リソースを消費する接続に変えます。 「大量の同時実行」では、これにより「接続が不足する」可能性があります。その時点では、誰も何もしていません。
代わりに、時々デッドロックする一般的なトランザクションの1つについて説明します。 (おそらくSHOW ENGINE=INNODB STATUS;
。)は、デッドロックの頻度を減らしたり、トランザクションを高速化したりする簡単な方法です。または、複数のトランザクションを1つに結合して、オーバーヘッドを減らすこともできます。
一方、これはあなたが言及しているものだと思いますか?
----- 2016-09-12 8.0.0開発マイルストーン&2016-09-06 5.7.15一般提供-追加または変更された機能-InnoDB -----
新しい動的構成オプション innodb_deadlock_detect を使用して、デッドロック検出を無効にすることができます。同時実行性の高いシステムでは、多数のスレッドが同じロックを待機している場合、デッドロック検出により速度が低下する可能性があります。時には、デッドロック検出を無効にして、デッドロックが発生したときにトランザクションのロールバックに innodb_lock_wait_timeout 設定を使用する方が効率的な場合があります。バグ#23477773)