MySQL MVCC(マルチバージョン同時制御)

4389 ワード

概要
同時MySQLを向上させるためにマルチバージョン同時制御が加えられ、古いバージョンのレコードを共有表領域に保存し、トランザクションがコミットされない前に対応するローレコードがロックされているか、トランザクションがコミットされた後に対応するレコードローがキャッシュに変更されてレコードが永続化され、リフレッシュ・スレッドが一定の法則でリフレッシュされると、ローの変更レコードが物理データ・ページにリフレッシュされ、共有テーブル・スペースの古いバージョンのレコード・ページも消去される.
 
本文
マルチバージョン同時制御はinnodbのrepeatable readとread committedの2つの独立性レベルのみを対象とします.マルチバージョン同時制御の原理は、各レコード行の後ろに2つの表示列を追加して行の状態を格納し、改行の新しいシステムバージョン番号と削除システムバージョン番号をそれぞれ格納することである.
≪バージョン番号|Version Number|oem_src≫:システムのバージョン番号は、増加するごとにトランザクションが増加します.
高性能mysqlという本を読むことによってMVCCは行レベルロックの変種であると解釈されているが、ロック操作を避けることが多いが、ほとんどが非ブロックの読み取り操作を実現し、書き込み操作も必要な行だけをロックしている.
 
TABLE
 
ID
NAME
Trx_id
De_Trx_id
1
a
1
 
4つのトランザクションがあります:select(trx=2)、insert(trx=3)、delete(trx=4)、update(trx=5)
現在、この4つのトランザクションは同時にローに対して操作を行い、SELECTの繰り返し読み取りを実証し、4つの操作がSLECTがコミットされる前にコミットされていないと仮定します.もちろん、SELECTは4つの操作の記録を表示することができます.
SELECT:
SELETは、次の2つの条件に基づいてレコードを検索します.
1.現在のトランザクションのバージョン番号以下のレコード行のみを検索します.
2.バージョン番号が空または現在の取引バージョン番号より大きいレコード行を削除します.
BEGIN TRAN

SELECT NAME FROM TABLE WHERE ID=1

 
ID
NAME
Trx_id
De_Trx_id
1
a
1
 
 
WAIT 10 MINUTE

SELECT NAME FROM TABLE WHERE ID=1

COMMIT

 
ID
NAME
Trx_id
De_Trx_id
1
a
1
4
SELECTの検索条件INSERTによって記録されたトランザクションバージョン番号は現在のバージョン番号より大きいので調べられません.DELETEのトランザクション削除バージョン番号が現在のバージョン番号より大きいため、その行が検出されます.UPDATEの第1行のトランザクションのバージョン番号が現在のバージョン番号より小さく、削除バージョン番号が現在のバージョン番号より大きいことが判明した.第2行はトランザクションバージョン番号が現在のバージョン番号より大きいため満足していない.最終SELECTクエリの記録はUPDATE操作の第1条の記録である.SELECTの2回のクエリの結果は一致し、繰り返し読み取り可能な独立性レベルを満たす.もちろんここではINSERT操作以外の操作はSELECT提出前に提出できません.
 
 
INSERT:
INSERT INTO TABLE(ID,NAME) VALUES(2,'B');

 
ID
NAME
Trx_id
De_Trx_id
2
b
2
 
 
DELETE:
DELETE FROM TABLE WHERE ID=1;

 
ID
NAME
Trx_id
De_Trx_id
1
a
1
3
 
 
UPDATE:
BEGIN TRAN

UPDATE TABLE

SET NAME='B'

WHERE ID=1

COMMIT

 
ID
NAME
Trx_id
De_Trx_id
1
a
1
4
 
ID
NAME
Trx_id
De_Trx_id
1
b
4
 
 
 
注:マルチバージョン同時制御ではmyisamストレージエンジンはサポートされていません.
まとめ
キャッシュにはロックを維持するためのリソースがあり、ロックの維持にはmysqlのリソースを消費する必要があります.マルチバージョン同時制御は、ロックを維持するためのリソースの消費を減らしてパフォーマンスを向上させることです.