分離レベル: 隔離はあなたが考えるよりも複雑です。 SQL 標準では 4 つの分離レベルが定義されており、これによって各トランザクションで行われた変更のうち、トランザクション内およびトランザクション間で表示されるものと表示されないものが決まります。一般的に、分離レベルが低いほど同時実行性が向上し、システムのオーバーヘッドが低くなります。 以下は、4 つの分離レベルについて簡単に紹介します。 1.READ UNCOMMITTED(非コミット読み取り) READ UNCOMMITTED レベルでは、トランザクションで行われた変更は、コミットされていない場合でも、他のトランザクションに表示されます。 トランザクションはコミットされていないデータを読み取ることができます。これはダーティ リードとも呼ばれます。このレベルは多くの問題を引き起こす可能性があります。パフォーマンスの点では、READ UNCOMMITTED は他のレベルと比べてそれほど優れているわけではありませんが、他のレベルの利点の多くを欠いています。非常に必要な理由がない限り、実際のアプリケーションで使用されることはほとんどありません。 (1)すべてのトランザクションは、コミットされていない他のトランザクションの実行結果を見ることができる (2)この分離レベルは、他のレベルと比べてパフォーマンスがそれほど優れていないため、実際のアプリケーションではほとんど使用されません。 (3)このレベルで発生する問題はダーティリードである。コミットされていないデータが読み込まれる。 #まず、分離レベルを変更します。set tx_isolation='READ-UNCOMMITTED'; @@tx_isolation を選択します。 +------------------+ | @@tx_isolation | +------------------+ | 読み取り未コミット | +------------------+#トランザクション A: トランザクションを開始します start transaction; tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+#トランザクション B: トランザクションも開始します (その後、2 つのトランザクションが交差します) 開始トランザクションをコミットせずにトランザクション B で更新ステートメントを実行します。 txを更新し、id=1の場合にnum=10を設定します。 tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+#トランザクション A: この時点でトランザクション A は更新されたデータを見ることができますか? tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 10 | ---> 見えますよ!これは、トランザクション B がまだコミットしていないデータを読み取ったことを意味します。 | 2 | 2 | | 3 | 3 | +------+------+#トランザクション B: トランザクション B はロールバックされますが、ロールバックはまだコミットされていません。 tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+#トランザクション A: トランザクション A に表示されるデータは、B が送信していないデータでもあります。select * from tx; +------+------+ | ID | 番号 | +------+------+ | 1 | 1 | ---> ダーティ リードとは、トランザクション B がコミットされていないにもかかわらず、このトランザクション (A) 内でデータの変更を確認できることを意味します。 | 2 | 2 | | 3 | 3 | +------+------+ 2.READ COMMITTED(コミットされた読み取り) ほとんどのデータベース システムのデフォルトの分離レベルは READ COMMITTED ですが、MySQL はそうではありません。READ COMMITTED は、上記の分離の単純な定義を満たしています。つまり、トランザクションが開始されると、コミットされたトランザクションによって行われた変更のみが「確認」されます。 つまり、トランザクションが開始してからコミットされるまでの間に行われた変更は、他のトランザクションには表示されません。 このレベルは、同じクエリを 2 回実行すると異なる結果が生成される可能性があるため、非反復読み取りと呼ばれることもあります。 (1) これはほとんどのデータベースシステムのデフォルトの分離レベルです(ただしMySQLは除きます)。 (2)分離性の単純な定義を満たしている:トランザクションは、すでにコミットされたトランザクションによって行われた変更のみを見ることができる。 (3) この分離レベルの問題は、非反復読み取りです。非反復読み取りとは、同じトランザクションでまったく同じ選択ステートメントを実行したときに、異なる結果が表示される可能性があることを意味します。 原因としては以下が考えられます: (1)新たなコミットを伴うクロストランザクションが発生し、データが変更される。 (2)データベースが複数のインスタンスによって操作される場合、このインスタンスの処理中に、同じトランザクションの他のインスタンスに新しいコミットが行われる可能性がある。 #まず分離レベルを変更します set tx_isolation='read-committed'; @@tx_isolation を選択します。 +----------------+ | @@tx_isolation | +----------------+ | コミット読み取り | +----------------+#トランザクション A: トランザクションを開始します start transaction; tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+#トランザクション B: トランザクションも開始します (その後、2 つのトランザクションが交差します) このトランザクションではデータが更新され、開始トランザクションはコミットされません。 txを更新し、id=1の場合にnum=10を設定します。 tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+#トランザクション A: この時点でトランザクション A のデータの変更を確認できますか? tx から * を選択します。 ---------------> +------+------+ | | ID | 番号 | | +------+------+ | | 1 | 1 |--->見えません! | | 2 | 2 | | | 3 | 3 | | +------+------+ |——>同じ選択ステートメントですが、結果は異なります| #トランザクション B: トランザクション B がコミットされた場合はどうなりますか? | コミット; | | #トランザクションA: | tx から * を選択します。 ---------------> +------+------+ | ID | 番号 | +------+------+ | 1 | 10 |--->トランザクション B がコミットされたため、トランザクション A のデータの変更を確認できます | 2 | 2 | | 3 | 3 | +------+------+ 3. 繰り返し読み取り REPEATABLE READ はダーティ リード問題を解決します。 このレベルでは、同じトランザクションで同じレコードを複数回読み取った結果の一貫性が確保されます。 ただし、理論的には、Repeatable Read 分離レベルでは、別の問題である Phantom Read を解決できません。いわゆるファントム リードとは、トランザクションが特定の範囲のレコードを読み取っているときに、別のトランザクションがその範囲内に新しいレコードを挿入する状況を指します。前のトランザクションがその範囲内のレコードを再度読み取ると、ファントム行が生成されます。InnoDB および XtraDB ストレージ エンジンは、マルチバージョン同時実行制御 (MVCC、Multiversion Concurrency Control) によってファントム リードの問題を解決します。 (1)これはMySQLのデフォルトのトランザクション分離レベルです (2)同じトランザクションの複数のインスタンスが同時にデータを読み取るときに、同じ行を参照することを保証します。 (3) このレベルで発生する可能性のある問題 - ファントム読み取り: ユーザーがデータ行の範囲を読み取ると、別のトランザクションがその範囲に新しい行を挿入します。ユーザーがその範囲内のデータ行を再度読み取ると、新しいファントム行が見つかります。 (4) InnoDBとFalconストレージエンジンは、マルチバージョン同時実行制御(MVCC)メカニズムを通じてこの問題を解決します。 #まず、分離レベルを変更します。set tx_isolation='repeatable-read'; @@tx_isolation を選択します。 +-----------------+ | @@tx_isolation | +-----------------+ | 繰り返し読み取り | +-----------------+#トランザクション A: トランザクションを開始します start transaction; tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+#トランザクション B: 新しいトランザクションを開始します (その後、2 つのトランザクションが交差します) トランザクション B でデータを更新し、開始トランザクションをコミットします。 txを更新し、id=1の場合にnum=10を設定します。 tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+ commit;#トランザクション A: トランザクション B がコミットされた場合でも、A はデータの変更を確認できますか? tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 1 | ---> まだ見えません! (これはレベル 2 とは異なり、レベル 3 では非反復読み取りの問題が解決されることも示しています) | 2 | 2 | | 3 | 3 | +------+------+#トランザクション A: トランザクション A もコミットされた場合にのみ、データの変更がコミットされたことがわかります。 tx から * を選択します。 +------+------+ | ID | 番号 | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+ 4.シリアル化可能 SERIALIZABLE は最高の分離レベルです。トランザクションを強制的にシリアルに実行することで、前述のファントム リードの問題を回避します。簡単に言うと、SERIALIZABLE は読み取られたデータの各行をロックするため、多くのタイムアウトやロック競合の問題が発生する可能性があります。 この分離レベルは、実際のアプリケーションではほとんど使用されません。データの一貫性を確保することが極めて必要であり、同時実行が許容されない場合にのみ考慮されます。 (1)これは最高の隔離レベルである (2)トランザクションが互いに競合しないように強制的に順序付けすることでファントムリード問題を解決します。つまり、読み取られたデータの各行に共有ロックが追加されます。 (3)このレベルでは、多数のタイムアウトやロック競合が発生する可能性がある。 #まず分離レベルを変更します set tx_isolation='serializable'; @@tx_isolation を選択します。 +----------------+ | @@tx_isolation | +----------------+ | シリアル化可能 | +----------------+#トランザクション A: 新しいトランザクションを開始します。#トランザクション B: A がコミットされる前は、このクロストランザクションはデータを変更できません。開始トランザクション。 tx値を挿入します('4','4'); エラー 1205 (HY000): ロック待機タイムアウトを超えました。トランザクションを再起動してください。 txを更新し、id=1の場合にnum=10を設定します。 エラー 1205 (HY000): ロック待機タイムアウトを超えました。トランザクションを再起動してください。 上記は、MySql の 4 つの分離レベルの詳細についての簡単な説明です。MySQL の分離レベルの詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。 以下もご興味があるかもしれません:
|
<<: vue+openlayer をベースにマップの集約と散乱効果を実現
まず Linux に ssh をインストールします。例として Centos を使用します。ポータル:...
理由: MySQL 5.7.5 以降では機能依存関係の検出が実装されています。 only_full_...
序文セキュリティ部門からSQLインジェクションやXSS攻撃の脆弱性などに関する警告メールを頻繁に受け...
序文count 関数は、テーブルまたは配列内のレコードをカウントするために使用されます。count(...
概要中小規模のプロジェクトでは、特にレポートを作成するときに、結合テーブル クエリが非常に一般的な操...
1. 単一列インデックスどの列にインデックスを作成するかを選択することは、パフォーマンス最適化プロ...
この記事では、 Webデザインに関連するこれら4 つの原則について説明します。これら4 つの原則を念...
目次事件の原因Node Scheduleを使用してスケジュールされたタスクを実装する1. node-...
nginx が proxy_pass を設定する場合、末尾に "/" がある U...
導入:従来の画像検証コードと比較して、スライダー検証コードには次の利点があります。サーバーは検証コー...
SMIL は、Web にタイミングとメディアの同期のサポートを追加します。 SMIL は、Web に...
この記事では、Ubuntu 18.04でのVMware Toolsのインストールと設定について記録し...
序文継続的なコード配信のプロセスで、Jenkins を利用して Docker イメージを作成すると、...
目次ステップ1: フレームワークを構築するステップ2 構築されたPromiseフレームワークに入力す...
CSS レイアウト - position プロパティposition 属性は、要素に適用する配置方法...