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ロー・ロックのステータスを表示するには、次の手順に従います.
二、意向所(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であり、以下の文を実行する.
id=6,7,8,9,10の既存のデータは排他ロックされます.idが11以上のデータは存在せず、ギャップロックされ、insert文挿入id=11を実行するとブロックされます.
InnoDBがギャップロックを使用する目的:幻読みを防止するために、関連する独立性レベルの要件を満たす. は、リカバリおよびレプリケーションのニーズを満たすために使用されます.
クリアランスロックをオンまたはオフにします.
注意:OFFまたは0はクリアランスロックを開き、ONまたは1はクリアランスロックを閉じることを示します.クリアランスロックを閉じる:
一、行錠
説明:
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つの意向ロックはいずれもテーブル・ロックである.
説明:
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