ホームページ  >  記事  >  データベース  >  データベーストランザクション分離レベルとは何ですか?

データベーストランザクション分離レベルとは何ですか?

青灯夜游
青灯夜游オリジナル
2021-05-24 15:05:1634309ブラウズ

データベース トランザクション分離レベル: 1. Read Uncommitted (コミットされていない読み取り)、2. Read Committed (コミットされた読み取り)、3.Repeatable Read (反復可能な読み取り)、4. Serializable (シリアル化可能)。

データベーストランザクション分離レベルとは何ですか?

このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。

データベース操作におけるトランザクション (トランザクション) は、データベースを操作する 1 つ以上の SQL ステートメントで構成される分割不可能な作業単位であり、これらの操作は完了またはキャンセルされます。

データベース トランザクション分離レベル

実際のアプリケーションでは、データベース内のデータは複数のユーザーによってアクセスされます。同時に、以下で詳しく説明するように、トランザクションの同時実行性の問題が発生する可能性があります。

1) ダーティ リーディング

は、あるトランザクションが別のトランザクションからコミットされていないデータを読み取ることを意味します。

2) Non-repeatable read

は、トランザクションが同じデータ行を 2 回読み取るが、結果が異なることを意味します。

3) 仮想読み取り/ファントム読み取り

は、トランザクションが 2 つのクエリを実行しますが、2 番目のクエリの結果には最初のクエリには現れなかったデータが含まれていることを意味します。

4) 更新の喪失

は、2 つのトランザクションが同時にデータ行を更新し、後で送信された (または取り消された) トランザクションが前のトランザクションによって送信されたデータを上書きすることを意味します。

失われた更新は、1 つ目のタイプの失われた更新と 2 つ目のタイプの失われた更新の 2 つのカテゴリに分類できます。

  • 最初のタイプの更新喪失は、2 つのトランザクションが同時に同じデータを操作する場合を指します。最初のトランザクションがキャンセルされると、送信された 2 番目のトランザクションの更新されたデータが失われます。は上書きされます。2 番目のトランザクションによりデータ損失が発生しました。

  • 2 番目のタイプの更新の喪失は、2 つのトランザクションが同じデータに対して同時に動作する場合を指します。最初のトランザクションが変更結果を正常に送信した後、次のトランザクションによって送信された変更は、 2 番目のトランザクションは上書きされ、2 番目のトランザクションのデータが失われます。

上記のトランザクションの同時実行性の問題を回避するために、標準 SQL 仕様では 4 つのトランザクション分離レベルが定義されています。分離レベルが異なれば、トランザクションの処理方法も異なります。これら 4 つのトランザクションの分離レベルは次のとおりです。

1) Read Uncommitted (コミットされていない読み取り)

トランザクションの実行中、他のトランザクションによってコミットされていない新しく挿入されたデータと、コミットされていないデータの両方にアクセスできます。変更されたデータ。トランザクションがデータの書き込みを開始した場合、別のトランザクションが同時にデータを書き込むことはできませんが、他のトランザクションはこのデータ行を読み取ることができます。この分離レベルにより、更新の損失が防止されます。

2) コミットされた読み取り

トランザクションの実行中、他のトランザクションによって正常に送信された新しく挿入されたデータと、正常に変更されたデータの両方にアクセスできます。データを読み取るトランザクションにより、他のトランザクションは引き続きデータ行にアクセスできますが、コミットされていない書き込みトランザクションにより、他のトランザクションは行にアクセスできなくなります。この分離レベルはダーティ リードを効果的に防止します。

3) 反復読み取り

トランザクションの実行中、他のトランザクションによって正常に送信された新しく挿入されたデータにはアクセスできますが、正常に変更されたデータにはアクセスできません。データを読み取るトランザクションは書き込みトランザクションを無効にし (ただし、読み取りトランザクションは許可します)、書き込みトランザクションは他のトランザクションを無効にします。この分離レベルは、非反復読み取りとダーティ読み取りを効果的に防止します。

4) シリアル化可能 (シリアル化可能)

厳密なトランザクション分離を提供します。トランザクションは逐次的に実行する必要がありますが、トランザクションは次々に実行することしかできず、同時に実行することはできません。この分離レベルは、ダーティ読み取り、反復不能読み取り、およびファントム読み取りを効果的に防止します。ただし、このレベルでは大量のタイムアウトやロック競合が発生する可能性があるため、実際のアプリケーションではほとんど使用されません。

一般に、トランザクションの分離レベルが高いほど、データベースの整合性と整合性をより確実に確保できます。ただし、相対的に言えば、分離レベルが高いほど、同時実行パフォーマンスへの影響は大きくなります。したがって、データベースの分離レベルは通常、コミットされたデータを読み取ることを意味する Read Committed に設定されます。これにより、ダーティ リードが防止され、同時実行パフォーマンスが向上します。この分離レベルは、反復不可能な読み取り、ファントム読み取り、タイプ 2 の更新の消失などの同時実行性の問題を引き起こす可能性がありますが、アプリケーションで悲観的ロックと楽観的ロックを使用することでこれらを制御できます。

関連する無料学習の推奨事項: mysql ビデオ チュートリアル

以上がデータベーストランザクション分離レベルとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。