MySQLの繰り返し読み取り可能独立性レベルの実現原理

2985 ワード

1、原理
MySQLのデフォルトの独立性レベルは、トランザクションAが1つのデータを読み込んだ後、トランザクションBがそのデータを修正してコミットすると、トランザクションAはそのデータを読み返し、元の内容を読み返します.では、MySQLの繰り返し読み取りはどのように実現されているのでしょうか.
使用するMVCCという制御方式、すなわちMutil-Version Concurrency Control、マルチバージョン同時制御は、楽観的なロックの実現方式に似ている.
実装方法:
InnoDBは、行ごとのレコードの後ろに2つの非表示の列を保存し、その行の作成時間と行の削除時間をそれぞれ保存します.ここに格納されているのは実際の時間値ではなく、システムのバージョン番号です.データが変更された場合、バージョン番号プラス1はトランザクションの読み込みが開始されると、現在のトランザクションにバージョン番号が与えられ、トランザクションはバージョン番号<=現在のバージョン番号のデータを読み込みます.このとき、他の書き込みトランザクションがこのデータを変更した場合、このデータのバージョン番号はプラス1になります.これにより、現在のリードトランザクションのバージョン番号よりも高くなり、自然に更新されたデータが読み取れなくなります.
2、添削して調べる
初期バージョン番号を1とします.
INSERT
insert into user (id,name) values (1,'Tom');

id
name
create_version
delete_version
1
Tom
1
 
文章の冒頭のシーンをシミュレートします.
SELECT(事務A)
select * from user where id = 1;

この時点で読み込まれたバージョン番号は1です.
UPDATE(取引B)
update user set name = 'Jerry' where id = 1;

更新操作の際、そのトランザクションのバージョン番号は元のベースに1を加算するので、バージョン番号は2になります.更新するデータを削除済みとしてマークし、削除したバージョン番号が現在のトランザクションのバージョン番号であり、新しいレコードの行を挿入します.
id
name
create_version
delete_version
1
Tom
1
2
1
Jerry
2
 
SELECT(事務A)
トランザクションAがデータを再読み込みします.
select * from user where id = 1;

トランザクションAはコミットされていないため、この時点で読み出されたバージョン番号は1なので、読み出されたのはTomというデータ、つまり繰り返し読める
DELETE
delete from user where id = 1;

削除操作の際、そのトランザクションのバージョン番号は元のものに1を加えますので、バージョン番号が3の場合は、現在のバージョン番号を削除バージョン番号とします
id
name
create_version
delete_version
1
Jerry
2
3