分離レベル
データベースのトランザクション分離レベルは、それぞれ非コミット読み取り、ローからハイに、4種類ありますが、読むにはコミットし、反復はSerializable、お読みください。また、そのサービスの同時動作のダーティリード、非反復リード、ファントムリードがあってもよいです。
- (非コミット読み取り)非コミット読み取り:トランザクションが別のコミットされていないトランザクションからデータを読み取ることができています。以下の2つのトランザクションが同時の場合、同じデータにアクセスすると、A、Bは、BトランザクションAトランザクションが変更されたデータを読み取りますが提出していません。
トランザクション | Bサービス | |
1 | トランザクションオープン | |
2 | Bトランザクションオープン | |
3 | トランザクションは、読み取りデータ1000、およびアップデートの使用、データ2000であります | |
4 | B読み出されたデータトランザクション2000 | |
5 | トランザクションのコミット |
- 読むには(提出を読んで)コミット:トランザクションがデータを読み取るために別のトランザクションのコミットを待機する必要があります。このトランザクションは、分離レベルはまだ問題を抱えている、多くの人が疑問を持って、トランザクションBの内容を読み取るすることは、A、AとBのトランザクションが間違っていない提出した後、これは何の問題もありますだけで取引のためではありません!?完全な分離レベルの分析の初の4種類を聞かせて、あなたの時間がかかる心配しないでください。
トランザクション | Bサービス | |
1 | トランザクションオープン | |
2 | Bトランザクションオープン | |
3 | トランザクションは、読み取りデータ1000、およびアップデートの使用、データ2000であります | |
4 | トランザクションのコミット | |
5 | Bの取引は、2000年のデータを読み込み、 |
- 反復可能読み取り(反復可能読み取り):データがスタート(オープン・トランザクション)で読み込まれると、もはや操作を変更することができませんが、この表現は厳格ではありません。データを変更するトランザクションがデータには影響しないと言ってB正確には、トランザクションを読んで、ええと、ええと、ええと、何地獄????私自身は混乱しました。私は、詳細な情報については、インターネットをチェックして、原則を把握することです。
オンライン説明:各ラインレコードは、時間とこの行の行を作成するための時間を節約するために削除された後にInnoDBは2つの隠された列を保存します。ここで記憶された時間の実際の値が、システムのバージョン番号、データが変更されたときに、バージョン番号が1だけインクリメントされません。トランザクションの開始を読んだときに、トランザクションは、バージョン番号を与える、現在のシステムのデータトランザクションは、バージョン番号<=現在のバージョン番号を読み込みます。このデータ他の書き込みトランザクションを変更する場合、この時点では、このデータのバージョン番号は、トランザクションを読んでより高い現在のバージョン番号よりも1つインクリメントされ、自動的に以下の更新より後に登録した取引データを読み込みます。
ここでは、バージョン番号の列プロパティ抽象的なバージョンでは、理解を容易にします。
ID | データ | 版 |
1 | 1000年 | 01 |
表1
ID | データ | 版 |
1 | 2000 | 02 |
表2
トランザクション | Bサービス | |
1 | トランザクションオープン、リードIDデータ01の1とバージョン番号であります | |
2 | Bトランザクションオープン、リードIDデータ01の1とバージョン番号であります | |
3 | データのトランザクションの更新データは、データ2000に等しく、このデータのバージョン番号が2となります | |
4 | トランザクションのコミット | |
5 | B会社は結果がまだ1000年で、Bのトランザクションは再びデータを読み込み、データのバージョン番号は、まだ1で取得します |
- シリアライズ(直列化):シリアライズトランザクション分離レベルは、このレベルで、最も高い、汚いを回避するために、トランザクションの実行の直列化順序は、非反復リードとファントムリードを読み出します。しかし、これは非効率的なトランザクション分離レベルで、データベースの比較消費性能、一般的に使用されていません。ここでは、あまりにも多くの導入をしません。
ダーティー(コミットされていない原因を読み取るために、トランザクション・レベル)を読み込みます
データのトランザクションA片が変更されたデータトランザクションを読むためにAとBは、トランザクションBは、ちょうど変更Aの後にデータを読み込みますが、Aはトランザクションを提出していませんが、後の工程でこのデータのロールバックまたは変更を再度、しかしBは、トランザクションを言うことができるBデータの読み出し、トランザクションを知らない汚れている、Bのトランザクションは、ダーティリードしました。
トランザクション | Bサービス | |
1 | トランザクションオープン | |
2 | Bトランザクションオープン | |
3 | トランザクションは、読み取りデータ1000、および更新データ2000 | |
4 | B読み出されたデータトランザクション2000 | |
5 | トランザクションのロールバックは1000年に、データバックを発生します | |
6 | 追加1000 2000に基づいて、トランザクション操作更新Bを実行します | |
7 | トランザクションがコミットされ、結果は3000(汚い)です。実際のデータは2000でなければなりません |
非反復リード(リードデータレベルをコミットするように設定するか、またはより低いレベルに起因します)
A及びBデータがトランザクションを読み取り、データのトランザクションA片は、トランザクションが再びこのデータを読み出す場合、データが変更見出さB、リードデータBの後に変更され、送信されました。ここで、上記のデータレベルはありません再読み込みエラーが同時の際に発生する可能性が持っているREAD COMMITTED分離に設定されている質問に答え。
トランザクション | Bサービス | |
1 | Bトランザクションオープン | |
2 | トランザクションオープン | |
3 | Bは、リードデータトランザクション1000 | |
4 | 更新は、データが2000になったトランザクションの実行 | |
5 | トランザクションが送信されました | |
Bの取引は、再び2000年のデータをデータを読み込み、 | ||
注記 | トランザクションの前と後のBは、同じデータを2回読み込みますが、結果は異なり、非反復可能読み取りであります |
マジック読書(データの総量は矛盾する前に二度読み)
トランザクション | Bサービス | |
1 | トランザクションオープン | |
2 | データ数は100を読まれます | |
3 | Bトランザクションオープン | |
4 | 新しいデータは50に追加することができます | |
5 | トランザクションをコミットします | |
6 | 再度読み取るとするデータ・トランザクションの数が150であることがわかっ | |
注記 | A前后两次读取的数据条数不相同,此为幻读 |
不可重复读和幻读的区别
不可重复度是针对update操作,幻读是针对insert操作delete操作
事务隔离级别与脏读、幻读和不可重读的关系(√:会出现 ×:不会出现)
脏读 | 不可重复读 | 幻读 | |
读未提交 | √ | √ | √ |
读提交 | × | √ | √ |
可重复度 | × | × | √ |
序列化 | × | × | × |