Mysqlトランザクションの実行

4164 ワード

InnoDB , , 。  
InnoDBで使用するロックタイプ
  • Shared and Exclusive Locks
  • 共有ロックは、ロックの所有者が1行のデータを読み取ることを可能にする.
  • S =>  S + S 

  • 排他ロックは、所有者が1行を更新または変更することを許可する.
  • X =>  X + NULL


  • Intention Locks
  • InnoDBでは、複数のパーティクルロックが許可されます.意向ロックはテーブル・レベルのロックであり、トランザクションが後でテーブル内のローにどのタイプのロックを必要とするかを示します.
  • は、トランザクションがテーブル内のローの共有ロックを取得できる前に、テーブル内のISロックまたはより強いロックを最初に取得する必要があるプロトコルをロックすることを意図している.トランザクションがテーブル内のローの排他ロックを取得する前に、テーブル内のIXロックを最初に取得する必要があります.
  • ロックが既存のロックと互換性がある場合は、要求されたトランザクションに付与されますが、既存のロックと競合している場合はロックは付与されません.トランザクションは、競合する既存のロックが解放されるまで待機します.ロック要求が既存のロックと競合し、デッドロックの原因で付与できない場合はエラーが発生します.

  • Record Locks
  • レコードロックは、インデックスレコードのロックであり、他のトランザクションの挿入、更新、または削除を防止します.
  • 行レベルのロックは、実際にはインデックスレコードロックです.

  • Gap Locks
  • ギャップロックは、インデックスレコード間のギャップのロック、または最初のインデックスレコードまたは最後のインデックスレコードの前のギャップのロックです.
  • ギャップ・ロックは、パフォーマンスと同時性のバランスの一部であり、他のレベルではなく特定のトランザクション・独立性レベルで使用されます.
  • 一意インデックスを使用してローをロックし、一意ローを検索する文にギャップロックは必要ありません.Unikey Keyを使った文です.
  • 条件文によって指定された列にインデックスが確立されていない場合、またはユニークでないインデックスがある場合、文は前のギャップをロックします.
  • 複数のトランザクションについて、同じ区間に確立された任意のタイプのGap Locksを許可する.

  • Next-Key Locks
  • 下キーロックは、このインデックス上のレコードロックと、このインデックス記録前のギャップロックの組み合わせです.
  • は、1つのセッションがインデックス内のレコードR上に共有または排他的ロックを有する場合、別のセッションがインデックス順にRの前のギャップに新しいインデックスレコードを挿入することができないことを説明する.

  • Insert Intention Locks
  • 挿入意図ロックは、行挿入前にINSERT操作により設けられたクリアランスロックの一種である.このロックは、複数のトランザクションがギャップ内の同じ位置に挿入されていない場合、同じインデックスギャップに挿入された複数のトランザクションを待つ必要がないという挿入意図の信号を送信します.
  • は、インデックスレコードがあると仮定し、その値はそれぞれ4および7である.A,Bトランザクションはそれぞれ値5と6を挿入しようとし、挿入行の排他的ロックを取得する前に、A,Bトランザクションは挿入意図的ロックを使用して4と7の間のギャップをロックしますが、行が衝突していないため、互いにブロックしないでください. 

  • AUTO-INC Locks
  • AUTO-INCロックは、トランザクションによって挿入されたAUTO_を持つ特殊なテーブル・レベル・ロックです.INCREMENT列のテーブルで取得します.最も単純な場合、1つのトランザクションがテーブルに値を挿入している場合、他のトランザクションは、最初のトランザクションが挿入したローが連続するプライマリ・キー値を受信するように、テーブルに自分が挿入するのを待つ必要があります.

  • Predicate Locks for Spatial Indexes
  • 空間インデックスの述語ロック
  • SPATIALインデックスに関する操作のロックを処理するために、下キーロックはREPEATABLE READまたはSERIALIZABLEトランザクション独立性レベルをうまくサポートできない.多次元データには絶対ソートの概念がないため、どちらが「次」キーなのかは不明です.SPATIALインデックスを持つテーブルの独立性レベルをサポートするために、InnoDBは述語ロックを使用します.SPATIALインデックスには最小境界矩形(MBR)値が含まれているため、InnoDBはクエリに使用するMBR値に述語ロックを設定することでインデックスの一貫した読み取りを強制する.他のトランザクションでは、クエリー条件に一致するローを挿入または変更することはできません.


  • InnoDBのトランザクションモデル
    14.7.2.1 Transaction Isolation Levels
    14.7.2.2 autocommit, Commit, and Rollback
    14.7.2.3 Consistent Nonlocking Reads
    14.7.2.4 Locking Reads
    1.トランザクションの独立性レベルは何に使用されますか.
    独立性レベルは、複数のトランザクションでクエリーの変更と実行を同時に行うときに、パフォーマンスと結果の信頼性、一貫性、繰返し性のバランスを微調整するための設定です.
    2.独立性レベルはどのようにして目標を達成しますか?
    独立性レベルは、異なるロックタイプを使用することで、微調整を実現します.
    3.独立性レベルにはどのようなものがありますか.また、独立性レベルに対応するロックのタイプは何ですか.
             1.   REPEATABLE READ : ,InnoDB REPEATABLE READ 。 , select , 。
  • ,InnoDB next-key 。
  • InnoDB READ COMMITTED   REPEATABLE READ  SELECT 。 , 。
  • REPEATABLE READ( ), 【select 】 。
  • InnoDB   。 , 。 。 : , SELECT , 。 ,
  •  2.  READ COMMITTED Gap Locksを無効にしました
  • この独立性レベルを使用すると、読み込みモードをロックして読み込みます
  • は、ロック読み込みを使用し、UPDATE文またはDELETE文の場合、InnoDBは、読み込み、更新または削除された行に対してのみロックを保持する.MySQLはWHERE条件を評価した後、不一致行のレコードロックを解放します.これはデッドロックの可能性を大幅に低減したが,依然として発生することができる.
  • 同じクエリが異なる時間に異なるロー・セットを生成すると、トランザクション内でいわゆる幻の問題が発生します.たとえば、SELECTが2回実行され、2回目のローが1回目のローではない場合、ローは「幻」ローです.



  •