web-dev-qa-db-ja.com

InnoDB MVCCとロック

InnoDBがサポートしていると私が理解していることから

  1. 行レベルのロック
  2. MVCC(マルチバージョン同時実行制御)

行レベルのロック

ロックは、複数のライターが同じ行を更新しようとした場合に使用します。一度に行を更新できるライターは1つだけで、行を更新する最初のライターが変更をコミットするまで行をロックします。他のライターは、最初のライターがコミットするまで待つ必要があります。ただし、少なくとも行レベルのロックでは、同じ行を更新している場合にのみ競合が発生します。

読み取りロックを使用して、更新中のレコード(またはページ)を他のユーザーが読み取らないようにして、他のユーザーが間もなく古くなった情報に基づいて操作するのを防ぐことができます。

https://stackoverflow.com/questions/6321647/innodbs-row-locking-the-same-as-mvcc-non-blocking-readshttps://en.wikipedia。 org/wiki/Lock_(データベース)

マルチバージョン同時実行制御

  1. ライターはリーダーをブロックしない

  2. 読者は誰もブロックせず、誰にもブロックされません。

https://stackoverflow.com/questions/22923127/mvcc-row-locking-vs-textbook-transaction-behavior

これら2つは互いに反対です。

私の質問は次のとおりです。ロックまたはmvccはいつ発生しますか?データベースが使用するものをどこに指定する必要がありますか?

2
TheOddGuy

MVCCは、読み取りコミットおよび反復可能読み取り(デフォルト)の分離レベルに適用されます。

これらの機能の両方を連携させるために何も指定する必要はありません。多分それを考える1つの方法は、一度に複数の行を更新できるように行レベルのロックが重要であり、MVCCは更新が読み取り操作にまったく影響しないようにすることです。

4
Morgan Tocker