ホームページ データベース mysql チュートリアル MySQL の 4 つのトランザクション分離レベル

MySQL の 4 つのトランザクション分離レベル

Dec 15, 2020 am 10:24 AM
mysql 分離レベル

mysql チュートリアルこのコラムでは 4 つのトランザクション分離レベルを紹介します

MySQL の 4 つのトランザクション分離レベル

推奨 (無料): mysql チュートリアル

# この記事の実験のテスト環境: Windows 10 cmd MySQL5.6.36 InnoDB

1. トランザクションの基本要素 (ACID)

1. 原子性: トランザクション開始後、すべての操作が完了するか完了しないかのどちらかです。 、途中で停滞することは不可能です。トランザクションの実行中にエラーが発生した場合、トランザクションが開始される前の状態にロールバックされ、すべての操作は発生しなかったかのように行われます。つまり、物事は、化学で習う物質の基本単位である原子のように、分割できない全体であるということです。

2. 一貫性: トランザクションの開始前と終了後、データベースの整合性制約は破壊されません。たとえば、A が B にお金を送金した場合、A がそのお金を差し引くが、B が受け取らないということは不可能です。

3. 分離: 同時に、同じデータを要求できるのは 1 つのトランザクションだけであり、異なるトランザクション間の干渉はありません。たとえば、A は銀行カードからお金を引き出していますが、B は A の引き出しプロセスが完了するまでこのカードにお金を送金することはできません。

4. 耐久性: トランザクションの完了後、トランザクションによるデータベースへのすべての更新はデータベースに保存され、ロールバックすることはできません。

2. トランザクションの同時実行の問題

1. ダーティ リード: トランザクション A はトランザクション B によって更新されたデータを読み取り、B は操作をロールバックします。の場合、A によって読み取られたデータはダーティ データです。

2. 反復不可能な読み取り: トランザクション A は同じデータを複数回読み取り、トランザクション B はトランザクション A で同じデータを複数回読み取ります。 、データが更新および送信されたため、トランザクション A が同じデータを複数回読み取ると、一貫性のない結果が発生しました。

3. ファントム リーディング: システム管理者 A はデータベース内のすべての生徒のスコアを特定のスコアから ABCDE 成績に変更しましたが、システム管理者 B はこの時点の記録に特定のスコアを挿入しました。システム管理者Aが修正を完了したところ、まだ修正されていないレコードが1つ残っていることに気づき、まるで幻覚を見たかのような状態になり、これをファントムリーディングといいます。

要約: 非反復読み取りとファントム読み取りは混同されやすいです。非反復読み取りは変更に焦点を当て、ファントム読み取りは追加または削除に焦点を当てます。反復不能読み取りの問題を解決するには、条件を満たす行をロックするだけでよく、ファントム読み取りの問題を解決するには、テーブルをロックする必要があります

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

#トランザクション分離レベル##ダーティリード##ファントムリードYesYesいいえ#シリアル化可能##No##

mysql のデフォルトのトランザクション分離レベルは、repeatable-read

4 です。例を使用して各分離レベルを説明します

1. コミットされていない読み取り:

(1) クライアント A を開き、現在のトランザクション モードを非コミット読み取り (アンコミット読み取り) に設定し、テーブル アカウントの初期値をクエリします:

(2) クライアント A のトランザクションがコミットされる前に、別のクライアント B を開いてテーブル アカウントを更新します:

トランザクションにはまだ送信されていませんが、クライアント A は B の更新されたデータをクエリできます:

(4) クライアント B のトランザクションが何らかの理由でロールバックされると、すべての操作が取り消されます。 、クライアント A によってクエリされたデータは実際にはダーティ データです:

幸運を取り除く] クライアント A によってクエリされたデータは、実際にはダーティデータです: set Balance = Balance - 50 ここでid =1でリレイの残高が350じゃなくて400になってました。おかしくないですか?データが矛盾しています。そう思ったらあなたは甘すぎます。アプリケーションでは400 -50=350を使用します。他のセッションがロールバックされたことを知りません。この問題を解決するには、読み取りコミット分離レベル

# を使用できます。2. 読み取りコミット

(1) クライアント A を開き、現在のトランザクション モードを読み取りコミット (読み取りコミット) に設定し、アカウント テーブルのすべてのレコードをクエリします:

( 2)クライアント A のトランザクションが送信される前に、別のクライアント B を開いてテーブル アカウントを更新します:

(3) この時点では、クライアント B のトランザクションはまだ送信されていません。送信完了、クライアント A は B の更新データをクエリできず、ダーティ リード問題が解決されます:

(4) クライアント B のトランザクション送信

(5) クライアント A は前のステップと同じクエリを実行しますが、結果が前のステップと一致しないため、反復不可能な読み取りの問題が発生します

3. リピータブルリード

(1) クライアント A を開き、現在のトランザクションモードをリピータブルリードに設定し、アカウントテーブルのすべてのレコードをクエリします

## アカウントのすべてのレコードは、ステップのクエリ結果と一致しています(1) 反復不可能な読み取りの問題はありません

## (4) クライアント A で、update Balance = Balance - 50 where id = 1 を実行すると、バランスは実行されます。 400-50=350にはなりませんが、リレイのバランス値は(2)の350を使って計算されるので300となり、データの整合性は崩れません。 MVCC メカニズムは反復読み取り分離レベルで使用されます。選択操作はバージョン番号を更新しませんが、スナップショット読み取り (履歴バージョン) です。挿入、更新、および削除はバージョン番号を更新し、現在の読み取り (現在のバージョン) です。バージョン)。

(5) クライアント B を再度開き、新しいデータを挿入して送信します。

(6)クライアント エンド A はアカウント テーブル内のすべてのレコードをクエリしますが、新しいデータは見つからないため、ファントム読み取りはありません

4. シリアル化

##(1 ) クライアント A を開き、現在のトランザクション モードをシリアル化可能に設定し、テーブル アカウントの初期値をクエリします:

(2) クライアント B を開き、現在のトランザクション モードをシリアル化可能に設定します。レコードを挿入するとエラーが報告されます。テーブルはロックされており、挿入は失敗します。mysql のトランザクション分離レベルがシリアル化可能である場合、テーブルはロックされるため、ファントム読み取りは発生しません。この場合、この分離レベルの同時実行性は非常に低く、開発ではほとんど使用されません。

#補足:

# 1. トランザクション分離レベルが読み取りコミットの場合、データの書き込みは対応する行のみをロックします

# 2

. トランザクション分離レベルがRepeatable Readの場合、検索条件にインデックス(主キーインデックスを含む)がある場合、デフォルトのロック方式はネクストキーロックになります。 # 検索条件

インデックスが存在しないため、データ更新時にテーブル全体がロックされます。ギャップはトランザクションによってロックされ、他のトランザクションはこのギャップにレコードを挿入できないため、ファントム読み取りが防止されます。 # 3. トランザクション分離レベルがシリアル化の場合、データの読み取りと書き込みによりテーブル全体がロックされます

4

分離レベルが高くなるほど、データの完全性と一貫性が保証されますが、同時実行パフォーマンスへの影響は大きくなります。

5. MYSQL MVCC 実装メカニズムのリファレンス リンク: https://blog.csdn.net/whoamiyang/article/details/51901888

6. ネクストキーロックについては、次のリンクを参照してください: https://blog.csdn.net/bigtree_3721/article/details/73731377

#Non-repeatable read ##Read-uncommitted Yes
Yes Non-repeatable read (read-committed) ) No
Yes Repeatable-read No
はい ##No##No

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

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL:初心者向けのデータ管理の容易さ MySQL:初心者向けのデータ管理の容易さ Apr 09, 2025 am 12:07 AM

MySQLは、インストールが簡単で、強力で管理しやすいため、初心者に適しています。 1.さまざまなオペレーティングシステムに適した、単純なインストールと構成。 2。データベースとテーブルの作成、挿入、クエリ、更新、削除などの基本操作をサポートします。 3.参加オペレーションやサブクエリなどの高度な機能を提供します。 4.インデックス、クエリの最適化、テーブルパーティション化により、パフォーマンスを改善できます。 5。データのセキュリティと一貫性を確保するために、バックアップ、リカバリ、セキュリティ対策をサポートします。

NAVICATでデータベースパスワードを取得できますか? NAVICATでデータベースパスワードを取得できますか? Apr 08, 2025 pm 09:51 PM

NAVICAT自体はデータベースパスワードを保存せず、暗号化されたパスワードのみを取得できます。解決策:1。パスワードマネージャーを確認します。 2。NAVICATの「パスワードを記憶する」機能を確認します。 3.データベースパスワードをリセットします。 4.データベース管理者に連絡してください。

Navicatプレミアムの作成方法 Navicatプレミアムの作成方法 Apr 09, 2025 am 07:09 AM

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

MySQLでテーブルをコピーする方法 MySQLでテーブルをコピーする方法 Apr 08, 2025 pm 07:24 PM

MySQLでテーブルをコピーするには、新しいテーブルの作成、データの挿入、外部キーの設定、インデックスのコピー、トリガー、ストアドプロシージャ、および機能が必要です。特定の手順には、同じ構造を持つ新しいテーブルの作成が含まれます。元のテーブルからデータを新しいテーブルに挿入します。同じ外部キーの制約を設定します(元のテーブルに1つがある場合)。同じインデックスを作成します。同じトリガーを作成します(元のテーブルに1つがある場合)。同じストアドプロシージャまたは関数を作成します(元のテーブルが使用されている場合)。

MariadBのNAVICATでデータベースパスワードを表示する方法は? MariadBのNAVICATでデータベースパスワードを表示する方法は? Apr 08, 2025 pm 09:18 PM

Passwordが暗号化された形式で保存されているため、MariadbのNavicatはデータベースパスワードを直接表示できません。データベースのセキュリティを確保するには、パスワードをリセットするには3つの方法があります。NAVICATを介してパスワードをリセットし、複雑なパスワードを設定します。構成ファイルを表示します(推奨されていない、高リスク)。システムコマンドラインツールを使用します(推奨されません。コマンドラインツールに習熟する必要があります)。

MySQL:簡単な学習のためのシンプルな概念 MySQL:簡単な学習のためのシンプルな概念 Apr 10, 2025 am 09:29 AM

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

NAVICATは、MySQL/Mariadb/PostgreSQLおよびその他のデータベースに接続できません NAVICATは、MySQL/Mariadb/PostgreSQLおよびその他のデータベースに接続できません Apr 08, 2025 pm 11:00 PM

NAVICATがデータベースとそのソリューションに接続できない一般的な理由:1。サーバーの実行ステータスを確認します。 2。接続情報を確認します。 3.ファイアウォール設定を調整します。 4.リモートアクセスを構成します。 5.ネットワークの問題のトラブルシューティング。 6.許可を確認します。 7.バージョンの互換性を確保します。 8。他の可能性のトラブルシューティング。

NAVICATでSQLを実行する方法 NAVICATでSQLを実行する方法 Apr 08, 2025 pm 11:42 PM

NAVICATでSQLを実行する手順:データベースに接続します。 SQLエディターウィンドウを作成します。 SQLクエリまたはスクリプトを書きます。 [実行]ボタンをクリックして、クエリまたはスクリプトを実行します。結果を表示します(クエリが実行された場合)。

See all articles