mysql Innodbロック機構

2741 ワード

参照先:https://blog.csdn.net/soonfly/article/details/70238902
一、行錠
  • 共有ロック(S):Sロックを持つリード・ロックのトランザクションは、データの読み取りのみを許可し、変更も許可しないし、データのXロックの取得も許可しない.
  • 排他ロック(X):ライトロックがXロックを保持するトランザクションとも呼ばれ、現在のトランザクションがデータを読み取り、変更し、他のトランザクションがデータを取得するXロックおよびSロックを排斥することができる.

  • 説明:
  • update/delete/insertは、関連するデータに排他ロック(X)
  • を自動的に追加します.
  • selectのデフォルトではロックタイプは追加されません.通常、selectはスナップショット方式でデータを読み出す
  • です.
  • select for updateプラス排他ロック(X)
  • select ... lock in share modeプラス共有ロック(S)
  • innodbロー・ロックのステータスを表示するには、次の手順に従います.
    show status like 'innodb_row_lock%';
    
    Variable_name                   Value
    ---------------------------------------
    Innodb_row_lock_current_waits   0
    Innodb_row_lock_time            1106
    Innodb_row_lock_time_avg        158
    Innodb_row_lock_time_max        809
    Innodb_row_lock_waits           7
    

    二、意向所(Intention Locks)
    ロー・ロックとテーブル・ロックの共存を可能にするために、多粒度ロック機構を実現するために、InnoDBには2つの内部で使用される意向ロック(Intention Locks)があり、この2つの意向ロックはいずれもテーブル・ロックである.
  • 意向共有ロック(IS):意向リードロックトランザクションはデータ行共有ロックを与えようとし、トランザクションは1つのデータ行に共有ロックを加える前にテーブルのISロックを取得しなければならない.
  • 意向排他ロック(IX):意向書き込みロックトランザクションは、データ行に排他ロックを追加するつもりであり、トランザクションは、データ行に排他ロックを追加する前に、テーブルのIXロックを取得しなければならない.

  • 説明:
  • 意向ロックはテーブル・レベル・ロックですが、トランザクションがテーブル全体ではなく1行のレコードを読んだり書いたりしていることを示します.したがって、意向ロックの間に衝突は発生せず、本当の衝突はロックをかけるときにチェックされます.
  • 行のレコードにロックをかける前に、まずテーブルに意図的なロックをかけます.すなわち,表意方向ロックと行ロックを同時に付加する.

  • InnoDB行ロックモード互換性リスト:
    -
    X
    IX
    S
    IS
    X




    IX




    S




    IS




    トランザクション・リクエストのロック・モードが現在のロックと互換性がある場合、InnoDBはリクエストされたロックにトランザクションを付与します.逆に、両方が互換性がない場合は、トランザクションはロックの解放を待たなければなりません.意向ロックはInnoDBが自動的に追加し、ユーザーの介入を必要としない.
    三、隙間ロック(Next-Key)
    範囲条件を使用してデータを取得し、共有または排他ロックを要求すると、InnoDBは条件を満たす既存のデータレコードのインデックス項目にロックをかけます.キー値が条件範囲内にあるが存在しない記録を「ギャップ(GAP)」と呼び、InnoDBもこの「ギャップ」にロックをかけ、このロックメカニズムがいわゆるギャップロック(Next-Keyロック)である.
    例えばxxxテーブルには10個のデータがあり、idはそれぞれ1から10であり、以下の文を実行する.
    select * from xxx where id > 5 for update
    

    id=6,7,8,9,10の既存のデータは排他ロックされます.idが11以上のデータは存在せず、ギャップロックされ、insert文挿入id=11を実行するとブロックされます.
    InnoDBがギャップロックを使用する目的:
  • 幻読みを防止するために、関連する独立性レベルの要件を満たす.
  • は、リカバリおよびレプリケーションのニーズを満たすために使用されます.

  • クリアランスロックをオンまたはオフにします.
    show variables like 'innodb_locks_unsafe_for_binlog';
    
    Variable_name                   Value
    ----------------------------------------
    innodb_locks_unsafe_for_binlog  OFF
    

    注意:OFFまたは0はクリアランスロックを開き、ONまたは1はクリアランスロックを閉じることを示します.クリアランスロックを閉じる:
    #  my.cnf   [mysqld]  ,  MySQL   
    [mysqld]
    innodb_locks_unsafe_for_binlog = 1