web-dev-qa-db-ja.com

テーブルレベルロックの利点

MyISAMストレージエンジンで使用されるテーブルレベルロックの利点は何ですか?行レベルのロックには、同時更新やテーブルをロックしない読み取りなど、多くの利点があります。

編集テーブルレベルのロックはデッドロックを防ぐと広く考えられています。しかし、同時実行性を犠牲にしてデッドロックを防止することには、どのような価値がありますか?

7
Rick James

MyISAMにはデッドロックはありませんが、ある意味でデッドロックは、テーブルレベルのロックを改善したものです。

ロックされたテーブルからINSERT/UPDATE/DELETEを行おうとする場合、テーブルが利用可能になるか、タイムアウトになるまで(デフォルトでは28800秒)待つ必要があります。行レベルのロックエンジンでデッドロックを使用すると、空きがなく、サーバーが一種の「無限ループ」(2つの接続が行をあきらめない)を検出した場合、少し待ってから、両方の接続をすばやく拒否します。デッドロックを与える。

デッドロックを解決しようとしている場合は、次の点を検討することをお勧めします。

  • デッドロックはトランザクションの不正なコードで発生しますか?計算を完了して更新するには、行を「保持」することが本当に必要ですか。
  • ステートメントに条件のインデックスはありますか?そうしないと、InnoDBが実際にテーブル全体を更新待ちとしてマークする可能性があります。
  • サーバー上のハードディスクがInnoDBの変更を十分に速くコミットしていない可能性がありますか?サーバーでのチェックポイント操作はInnoDBで問題/ストールを引き起こしますか?
  • 自動インクリメントロックのためですか?もしそうなら、多分もっと寛大な自動インクリメントを見る必要があります-設定 http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html (行レベルのロックも確認して、そのような変更によって引き起こされる問題の一部を解決してください)
5
Jonathan

Mysqlはこの方法でクエリの実行をスケジュールするので、

  • 書き込み要求(UPDATEやDELETEなど)は、読み取り要求(SELECT)よりも優先されます。
  • サーバーは書き込みを実行しますFIFO方法(受信した順序で)

メリットは何ですか?

MyISAMではデッドロックは発生しません。 MySQLサーバーは、明示的(LOCK TABLEs)または暗黙的(Any DML)のすべての競合を管理できます。

MyISAMテーブルに削除または更新されたレコードがない限り、同時挿入は自由に実行できます。それには、実際には、明示的な読み取りロックを持つテーブルに対するINSERTが含まれます。

ギャップのあるテーブルの場合、OPTIMIZE TABLEを実行すると、それらのギャップが削除され、同時挿入が再び可能になります。

詳細については、 "MySQL 5.0認定試験ガイド"ページ408-412のセクション29.2 を参照してください。

6
RolandoMySQLDBA

(MyISAMで使用されるような)テーブルロックには deadlock の問題はありません。

3
Derek Downey

2つの利点。

a。テーブルのロックは、デッドロックの問題を解決するための ブルートフォースアルゴリズム の例です。ブルートフォースは常に適切に機能します。

Unixの共同発明者であるケントンプソンは、「疑わしい場合はブルートフォースを使用する」というエピグラムを発したと報告されています。彼はおそらくこれを単なる真面目なものとして意図していましたが、元のUnixカーネルが脆弱で「スマート」なアルゴリズムよりもシンプルで堅牢で移植性の高いアルゴリズムを好んでいたことが、そのOSの成功に大きな影響を与えたようです。ソフトウェア設計における他の多くのトレードオフと同様に、ブルートフォースと複雑で細かく調整された賢さの間の選択は、エンジニアリングに精通した繊細な審美的判断の両方を必要とする難しいものです。

b。エンジニアリングに精通し、審美的な判断を下すにつれて、間違いなくさまざまな決定を下すことになります。これは、上記の「a」の有効性には影響しません。