Mysqlトランザクションの独立性

3663 ワード

トランザクションが同時に発生する問題
トランザクションの同時実行によるデータの読み取りに関する問題は、それぞれ一言で説明します.
  1.ダーティリード:トランザクションAは、トランザクションBがコミットしていないデータを読み出し、それに基づいて他の操作を行います.(読み取りコミットなし)
  2.繰り返し不可:トランザクションAは、トランザクションBがコミットした変更データを読み出します.(新規コミットupdateの読み込み)
  3.幻読み:トランザクションAは、トランザクションBがコミットした新しいデータの影響を受けます.(コミットされた更新は表示されませんが、書き込み操作の実行に影響します)
 
トランザクションの独立性
データベース・トランザクションの独立性レベルは、Read uncommitted、Read committed、Repeatable read、Serializableの順に4つあります.この4つのレベルでは、汚れた読み取り、重複しない読み取り、幻の読み取りなどの問題を1つずつ解決できます.
 
汚読
繰り返し不可
まぼろし読み
Read uncommitted



Read committed
×


Repeatable read
×
×

Serializable
×
×
×
独立性テスト:https://blog.csdn.net/johnstrive/article/details/46724315
https://www.cnblogs.com/huanongying/p/7021555.html
 
独立性レベルの設定
有効範囲の設定は現在のトランザクションです
mysql 5
select @@tx_isolation;
set tx_isolation='read-uncommitted';

mysql 8
select @@transaction_isolation;
set transaction_isolation='read-uncommitted';

Repeatable read(デフォルト)
トランザクションがselectを最初に実行するとスナップショットが記録され、その後selectが実行され、スナップショットの内容のみが読み込まれます.他のトランザクションcommitの変更情報(insert,delete,update)は、本トランザクションには表示されません.幻読み現象が発生しますが、現在のトランザクションのUpdate、Insertの正確性には影響しません.
update、insert、delete条件がインデックスにヒットすることに注意してください.そうでない場合は、テーブルロックが直接オンになります.
A
B
説明
select * fromn tb_pet;
select * fromn tb_pet;
A,Bが取得したデータ記録は一致し、データ(id,name,shl,ml)(3,「old」,1500)がある.
start transaction
-
トランザクションAの開始
-
start transaction
トランザクションの開始
-
insert into tb_pet(id,name,shl,ml) values(6,“bull”,1,1000);
Bデータを挿入し、鍵をかける(トランザクションBはコミットされず、他のものはトランザクションBのコミットを待ってから変更する必要がある)
 
update tb_pet set name="new",shl=2 where id=3
Bデータの修正、施錠
select * from tb_pet;
select * from tb_pet;
AはBが挿入したデータを取得せず、ダーティリードを生成せず、Aはtb_を生成するpetスナップショット
-
commit;
トランザクションBコミット
select * from tb_pet; 結果:(3,“old”,1500)
-
A新規および更新されたBのデータが読み込めず、再読み込み可能(この時点でトランザクションAはコミットされていない)
update tb_pet set name="first"where id=3 and name="old";
-
0行が影響を受けます.A id=3が見えないnameが修正され、幻読みが発生する.しかし、システムには条件を満たすデータはありません.
update tb_pet set shl=shl+1 where id=3 ;
-
このときAは結果数が2になると考えている
select * from tb_pet where id=3; 結果:(3,「new」,3500)
-
幻読を起こす
insert into tb_pet(id,name,shl,ml) values(6,“bull”,1,1000);
-
A挿入に失敗し、Duplicate keyエラー(iはプライマリキー)を報告し、幻読を発生し、Aクエリはid=6の記録に至らず、理論的にはこの記録を挿入することができるが、実際にはBはすでにこの記録を挿入しており、Aにとってid=6の記録を幻読している
 
 
 
 
 
 
read-committed
両方のmysqlクライアントA,Bは、「read-committed」独立性レベルに設定され、Aはトランザクションが自動的にコミットされないことを設定し、Bはトランザクションが自動的にコミットされないことを設定します.
A
B
説明
select * fromn tb_pet;
select * fromn tb_pet;
A,Bが取得したデータレコードは一致する
start transaction
-
トランザクションAの開始(トランザクションAはコミットされていません)
-
start transaction
トランザクション開始(トランザクションBはコミットされていません)
-
insert into tb_pet values(5,“mouse”,1,500);
Bデータ挿入(トランザクションBがコミットされていない)
select * from tb_pet;
select * from tb_pet;
AはBが挿入したデータを取得せず、ダーティリードを生じない
-
commit;
トランザクションBコミット
select * from tb_pet;
-
A新たにBに追加されたデータが読み込まれ、重複しない読み取りが発生した(この時点でトランザクションAはコミットされていない)
 
補足:
1、トランザクション・独立性レベルがコミットされたとき、書き込みデータは対応するローのみロックされます.
2、トランザクション独立性レベルが繰返し可能な場合、取得条件にインデックス(プライマリ・キー・インデックスを含む)がある場合、デフォルトのロック方式はnext-keyロックである.検索条件にインデックスがない場合、データの更新時にテーブル全体がロックされます.1つのギャップがトランザクションにロックされ、他のトランザクションはこのギャップに記録を挿入できません.これにより、幻読みを防止できます.
3、トランザクション独立性レベルがシリアル化されている場合、読み書きデータはテーブル全体にロックされます.