ホームページ  >  記事  >  データベース  >  高パフォーマンス MySQL - トランザクションと分離レベルの詳細な説明

高パフォーマンス MySQL - トランザクションと分離レベルの詳細な説明

黄舟
黄舟オリジナル
2017-03-15 17:19:061261ブラウズ


この記事には主に以下の内容が含まれます:
(1) トランザクションとACIDの概念
(2) トランザクション分離レベル
(3) MySQL

のトランザクション 1. トランザクションと ACID

トランザクションを理解することは、他の高度な概念の基礎です。

トランザクション: トランザクションはアトミック SQLクエリのセット、またはすべてが成功するか、すべて失敗すると、トランザクション前の 状態 にロールバックされます。

データベースにおける ACID の概念、つまり原子性、一貫性、分離性、耐久性を理解しましょう。
(1) 原子性: トランザクション内の操作は分割できない全体的な単位であり、すべてが完了するか、何も完了しないかのどちらかです。

(2) 一貫性: データベースはトランザクション実行の前後で一貫した状態にある必要があります。

(3) 分離: 一般に、1 つのトランザクションによって行われた変更は、最終送信されるまでは他のトランザクションからは見えません。これには、トランザクション分離レベルの問題が関係します。

(4) 永続性: トランザクションが送信されると、変更は永続的になり、サーバーがダウンしても影響を受けません。

ACID をよりよく理解するために、例として銀行口座振替を考えてみましょう:

-- 开始事务START TRANSACTION;
-- 查询支票账户余额+
SELECT balance FROM checking WHERE customer_id = 10233276;+
-- 将支票账户减去200UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
-- 将余额账户增加200UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
-- 提交事务更新COMMIT;

アトミック性: 完全にコミットされる (10233276 の当座預金残高が 200 減り、普通預金残高が 200 増える)、または完全にロールバックされました (2 テーブルの残高は変わりません)

一貫性: この例の一貫性は、3 行目まで実行した後、4 行目までにデータベース システムがクラッシュするため、200 元が消えないという事実に反映されています。ライン、物事がまだそこにないので送信します。

分離: 1 つのトランザクション内の操作ステートメントは、他のトランザクションのステートメントから分離することができます。たとえば、トランザクション A が行 3 の後と行 4 の前で実行されている場合でも、トランザクション B が当座預金残高を照会するときに、分離することができます。トランザクション A と B は互いに分離されているため、トランザクション A で 200 元が差し引かれていることがわかります (口座の金額は変化しません)。トランザクション A がコミットされるまで、トランザクション B はデータの変更を監視できません。

永続性: これは理解しやすいです。つまり、トランザクションが送信された後、変更は永続的になります。

トランザクションはロックと同様に多くの作業を必要とするため、トランザクションのサポートが必要かどうかを決定し、独自のニーズに基づいてさまざまなストレージ エンジンを選択できます。

2. トランザクション分離レベル

SQL は、トランザクション内のどのデータが表示されるかを制限する 4 つの分離レベルを定義します。低レベルの分離レベルでは同時実行性が高く、システムのオーバーヘッドが小さいことは明らかですが、データ セキュリティの問題が伴います。

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

この分離レベルでは、すべてのトランザクションが他のコミットされていないトランザクションの実行結果を確認できます。コミットされていないデータの読み取りは、ダーティ リードとも呼ばれます。このレベルはほとんど使用されません。

Read Committed

これは、ほとんどのデータベース システムのデフォルトの分離レベルです (ただし、MySQL のデフォルトではありません)。これは分離の単純な定義を満たしています。つまり、トランザクションはコミットされたトランザクションによって行われた変更のみを確認できます。つまり、トランザクションがコミットされるまでは他のトランザクションには見えません。この分離レベルは、反復不可能な読み取りもサポートします。これは、同じトランザクションの他のインスタンスがこのインスタンスの処理中に新しいコミットを行う可能性があるため、同じ選択クエリが異なる結果を返す可能性があるためです。

Repeatable Read (反復可能な読み取り)

これは MySQL のデフォルトのトランザクション分離レベルです。 データを同時に読み取るときに、同じトランザクションの複数のインスタンスが同じデータ行を参照できるようにします。ただし、理論的には、これはファントム リード (ファントム リード) という別のやっかいな問題につながります。簡単に言えば、ファントム読み取りとは、ユーザーが特定の範囲のデータ行を読み取るときに、別のトランザクションがその範囲に新しい行を挿入することを意味します。ユーザーがその範囲内のデータ行を読み取ると、新しい「ファントム」OK が存在することがわかります。 。 InnoDB および Falcon ストレージ エンジンは、マルチバージョン同時実行制御 (MVCC、Multiversion Concurrency Control) メカニズムを通じてこの問題を解決します。

シリアル化可能

これは、トランザクションを強制的にシリアルに実行し、トランザクションが相互に競合することを不可能にし、それによってファントム読み取りの問題を解決します。つまり、読み取られた各データ行に共有ロックが追加されます。このレベルでは、多数のタイムアウトやロック競合が発生する可能性があります。

これら 4 つの分離セクターを MySQL に実装することで生じる可能性のある問題は次のとおりです:
高パフォーマンス MySQL - トランザクションと分離レベルの詳細な説明

3. MySQL のトランザクション

MySQL のデフォルトでは、自動コミット モード (AutoCommit) が採用されています。トランザクションを開始するには、各クエリ操作がトランザクションとして扱われ、コミット操作として実行されます。

AUTOCOMMIT 変数を設定することで、自動コミット モードを有効または無効にできます。
1 を設定すると AUTOCOMMIT が有効になり、0 を設定すると AUTOCOMMIT が無効になります。


この記事には主に以下の内容が含まれます:
(1) トランザクションとACIDの概念
(2) トランザクション分離レベル
(3) MySQLのトランザクション

以上が高パフォーマンス MySQL - トランザクションと分離レベルの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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