検索
ホームページデータベースmysql チュートリアルMySQL ロックとトランザクション分離レベル (概要)

MySQL ロックとトランザクション分離レベル (概要)

Nov 23, 2019 pm 04:58 PM
innodbmvccmysql事務ロック

今日のインターネットでは、データベースなしでは大規模なマルチプレイヤー APP を開発できません。誰もが高い同時実行性で読み書きできることを保証する方法は、常に難しいアーキテクチャ上の問題でした。まず第一に、高い同時実行性が排除され、一貫した読み書きを保証するために最も一般的に使用される方法はトランザクションであり、実装の重要なポイントです。トランザクションがロックされているメカニズム。

MySQL ロックとトランザクション分離レベル (概要)

今日は、一貫した読み取りと書き込みを実現するために、InnoDB ストレージ エンジンが高い同時実行性の下でロック メカニズムを実装する方法の原理と実装を紹介します。

ロック

データベースのロック メカニズムは、データベースをファイル システムと区別する重要な機能です。共有リソースへの同時アクセスを管理するために使用されます。 InnoDB は、操作データ テーブル、LRU ページ リスト、バッファ プール内のデータ行など、多くの場所でロック メカニズムを使用しており、一貫性と整合性を確保するには、ロック メカニズムが必要です。

データベースが異なると、ロック メカニズムの設計と実装は完全に異なります。

##MyISAM エンジン: テーブル ロックの設計、同時読み取りは問題ありませんが、同時書き込みのパフォーマンスは劣ります。

#●Microsoft SQL Server: オプティミスティック同時実行とペシミスティック同時実行をサポートします。オプティミスティック同時実行は行レベルのロックをサポートします。ロックの維持にはコストがかかります。行ロックの数がしきい値を超えると、テーブル ロックにアップグレードされます。

#●InnoDB エンジン: 行ロックをサポートし、一貫した非ロック読み取りを提供します。行ロックには追加のオーバーヘッドはなく、パフォーマンスも低下しません。

#●Oracle: InnoDB エンジンに非常に似ています。

2 種類のロック: ロックとラッチ

データベースでは、ロックとラッチの両方をロックと呼ぶことができますが、大きな違いがあります。違い。 ラッチは一般にラッチと呼ばれ、同時スレッドによる重要なリソース操作の正確性を保証するために使用されます。オブジェクトはメモリ データ構造です。ロック時間は非常に短くする必要があり、デッドロックは発生しません。検出されました。 InnoDB エンジンでは、mutex (ミューテックス) と rwlock (読み取り/書き込みロック) に分けられます。

Lock は、データベース内のテーブル、ページ、行などのオブジェクトをロックするために使用されます。対象はトランザクションです。コミット/ロールバック後に解放され、デッドロックが検出されます。行ロック、テーブル ロック、インテント ロックに分かれています。

下記の錠前は錠前タイプの錠前を指します。

4 つのロック タイプ

InnoDB は 4 つのロックをサポートします: # 共有ロック (S ロック): トランザクションを許可します。データ行

##●排他的ロック (X ロック): トランザクションによるデータ行の削除または更新を許可します

##●意図 S ロック: トランザクションはテーブル内の特定の行を取得しようとします。ロック

#意図 X ロック: トランザクションはテーブル内の特定の行の排他ロックを取得しようとしています

#トランザクション T1 が行の共有ロックを取得すると、行データは変更されないため、トランザクション T2 は、行 r の共有ロックを直接取得することもできます。これをロック互換と呼びます。

トランザクション T3 がデータを変更するために行 r の排他ロックを取得したい場合、T1/T2 が行共有ロックを解放するまで待つ必要があります。これはロックの非互換性と呼ばれます。

S ロックと X ロックはどちらも行ロックですが、IS ロックと IX ロックは意図的なロックであり、テーブル ロックに属します。インテンション ロックは、トランザクション内の次の行に要求されるロックのタイプを明らかにするように設計されています。つまり、テーブル ロックのより細かい粒度でロックします。 InnoDB はテーブル ロックをサポートしているため、インテント ロックはテーブル全体のスキャン以外のリクエストをブロックしません。

ロックの互換性:

#ISIX#IS互換性あり互換性あり互換性あり互換性なしIX互換性あり互換性あり互換性なし互換性なしS互換性あり互換性なし#互換性あり#互換性なし非互換ストレージ トランザクションおよびロック情報の 3 つのテーブルshow Engine innodb status コマンドを使用して、トランザクション セクションで現在のロック リクエストの情報を表示できます。
S
##XX 互換性なし 非互換 非互換

InnoDB1.0 以降、INNODB_TRX (トランザクション テーブル)、INNODB_LOCKS (ロック テーブル)、INNODB_LOCK_WAITS (ロック待機テーブル) が INFORMATION_SCHEMA アーキテクチャの下に追加され、これら 3 つのテーブルを通じて、現在の状況を監視できます。リアルタイムでトランザクションを分析し、考えられるテーブルの問題を分析します。 3 つのテーブルの定義は次のとおりです:

INNODB_TRX

##trx_id

InnoDB ストレージ エンジン内の一意のトランザクション ID現在のトランザクションのステータス trx_startedトランザクションの開始時刻trx_requested_lock_idトランザクションを待機しているロック IDC。ステータスが LO​​CK WAIT でない場合は、 NULLtrx_wait_startedトランザクションの開始を待機する時間trx_weightトランザクションの重みトランザクションは、トランザクションによって変更およびロックされた行の数を反映します。ロールバックが必要な場合は、ロールバックの値が最も小さいトランザクションを選択します。trx_mysql_thread_idMySQL のスレッド ID、show processlist で表示される結果 trx_queryトランザクション操作の SQL ステートメント
trx_state
#lock_idlock_trx_idトランザクション IDlock_modeロック モードlock_typeロックのタイプ、テーブル ロックまたは行ロックlock_tableロック対象のテーブルlock_indexロックされたインデックス#ロック オブジェクトのスペース ID##lock_page#lock_recトランザクション ロックされた行の数、テーブルがロックされている場合は NULL トランザクション ロック レコードの主キー値。テーブルがロックされている場合は NULL になります。 #INNODB_LOCK_WAITS##requesting_trx_id
#INNODB_LOCKS
lockID
#lock_space
ロック オブジェクトの数トランザクション ロックされたページ、テーブルがロックされている場合は NULL
#lock_data
ロック リソースを申請するためのトランザクション ID適用 ロックの IDblocking_trx_idブロックするトランザクション IDblocking_lock_idブロッキング ロック IDINNODB_TRX を通じて、すべてのトランザクション、トランザクションがブロックされているかどうか、およびブロックされたロック ID を確認できます。 その後、 を通じてすべてのロック情報を表示します。 INNODB_LOCK_WAITS を通じてロックの待機情報とブロック関係を確認できます。
requesting_lock_id
INNODB_LOCKSその後、
これら 3 つのテーブルを使用すると、トランザクションとロックのステータスをより明確に表示でき、結合クエリを実行することもできます。次のシナリオでは、これら 3 つのテーブルの内容を示します。

#分離レベル

まず、データベースの 4 つのトランザクション分離レベルについて説明します。 UNCOMMITTED (0 ): ブラウズ アクセス レベル、ダーティ読み取り、非反復読み取り、およびファントム読み取りがあります。#●READ COMMITTED(1): カーソル安定性レベル、非反復読み取り、ファントム読み取りがあります

● REPEATABLE READ( 2): ファントム読み取りあり

# SERIALIZABLE (3): 分離レベル、トランザクションのセキュリティは確保されていますが、完全にシリアルでパフォーマンスが低いです

これら 4 つのトランザクション分離InnoDB のデフォルトの分離レベルは REAPEATABLE READ ですが、他のデータベースとは異なり、ファントム リードの発生を回避できる Next-Key-Lock ロック アルゴリズムも使用するため、SQL 標準のレベルを完全に満たすことができます。トランザクション分離要件、つまり、SERIALIZABLE 分離レベルを達成できます。 分離レベルが低いほど、トランザクションによって要求されるロックが少なくなるか、ロックの保持時間が短くなるため、ほとんどのデータベースのデフォルトの分離レベルは READ COMMITED になります。ただし、関連する分析では、分離レベルのパフォーマンスのオーバーヘッドはほぼ同じであるため、ユーザーがパフォーマンスを向上させるために分離レベルを調整する必要がないことも指摘しています。

トランザクション分離レベルを表示および変更するコマンド:

mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ        |
+------------------------+
1 row in set (0.00 sec)

mysql> set session transaction isolation level SERIALIZABLE;
Query OK, 0 rows affected (0.00 sec)
この例では、このセッションのトランザクション分離レベルが変更されます。グローバル パラメーターを変更する必要がある場合は、セッションを置き換えることができますグローバルで。永続的な変更を加えたい場合は、設定ファイルを変更する必要があります。

[mysqld]
transaction-isolation = READ-COMMITED
SERIALIZABLE のトランザクション分離レベルでは、InnoDB は各 SELECT ステートメントの後に LOCK IN SHARE MODE を自動的に追加し、共有ロックを読み取り操作。そのため、一貫した非ロック読み取りはサポートされなくなりました。

InnoDB は REPEATABLE READ 分離レベルで SERIALIZABLE に到達できるため、通常は最高の分離レベルを使用する必要はありません。

一貫した非ロック読み取りと複数バージョンの同時実行制御

一貫した非ロック読み取り (一貫した非ロック読み取り) とは、InnoDB のことを指します。複数行 現在の実行時にデータベース内の行データを読み取るバージョン管理 (Multi Version Concurrency Control、MVCC) メソッド。

つまり、読み取り行が変更操作を受けている場合、読み取りは行ロックの解放を待たずに、行のスナップショット データを読み取ります。スナップショットは行の履歴データを指し、元に戻す操作によって完了します。この方法により、データベースの同時実行性が大幅に向上します。これは InnoDB のデフォルト設定でもあります。

スナップショットは現在の行の履歴バージョンですが、複数のバージョンが存在する場合があります。行データには複数のスナップショット データがあります。このテクノロジは行マルチバージョン テクノロジとなり、その結果生じる同時実行制御はマルチ-スナップショット。バージョン同時実行制御 (MVCC)。 InnoDB は、READ COMMITED および REPEATABLE READ 分離レベルで非ロックの一貫した読み取りを使用しますが、これら 2 つの分離レベルで使用されるクイック データ定義は異なります。

#● READ COMMITED: 常に最新のスナップショットを読み取ります

● REPEATABLE READ: トランザクションの開始時に常に行データのバージョンを読み取ります。

例を実行します。

##一貫した非ロック読み取り

Time

セッション A

セッション B

12select * from z where a = 3;##開始4update z set b=2 where a=3;5##コミット;7選択* z から、a = 3;##8
BEGIN
3


select * from z where a = 3 ;
6

COMMIT;
##

在这个例子中我们可以清晰的看到0、1、2三种隔离级别的区别:

#在事务开始前我们可以分别调整为0、1、2三种隔离级别,来查看不同的输出
mysql> set session transaction isolation level READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set (0.00 sec)

# A会话:T1事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from z where a = 3;
+---+------+
| a | b    |
+---+------+
| 3 |    1 |
+---+------+
1 row in set (0.00 sec)

# B会话:T2事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update z set b=2 where a=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

# A会话:T1事务,如果此时隔离级别是READ-UNCOMMITTED,因为此刻事务2可能会回滚,所以出现了脏读
mysql> select * from z where a=3;
+---+------+
| a | b    |
+---+------+
| 3 |    2 |
+---+------+
1 row in set (0.00 sec)

# A会话:T1事务,如果此时隔离级别是大于READ-UNCOMMITTED的更高级别
mysql> select * from z where a=3;
+---+------+
| a | b    |
+---+------+
| 3 |    1 |
+---+------+
1 row in set (0.00 sec)

# B会话:T2事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

# A会话:T1事务,如果此时隔离级别是READ-COMMITTED,因为数据和事务开始时读取的出现了不一致,因此称为不可重复读,能够读到其他事务的结果,违反了事务的隔离性
mysql> select * from z where a=3;
+---+------+
| a | b    |
+---+------+
| 3 |    2 |
+---+------+
1 row in set (0.00 sec)

# A会话:T1事务,如果此时隔离级别是大于READ-COMMITTED的更高级别
mysql> select * from z where a=3;
+---+------+
| a | b    |
+---+------+
| 3 |    1 |
+---+------+
1 row in set (0.00 sec)

# A会话:T1事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

一致性锁定读和SERIALIZABLE隔离

在默认的REPEATABLE READ隔离级别时,InnoDB使用的是一致性非锁定读。但有时我们也需要显示的指定使用一致性锁定读来保证读取操作时对数据进行加锁达到一致性。这要求数据库支持锁定读加锁语句:

 ● select ... for update: 读取时对行记录加X锁

 ● select ... lock in share mode:读取时对行记录加一个S锁

这两种锁必须在一个事务中,当事务提交后锁也就释放了,因此务必加上BEGIN, START TRANSACTION或者SET AUTOCOMMIT=0。

我们在前面隔离级别时也说过SERIALIZABLE隔离级别会对读操作自动加上LOCK IN SHARE MODE指令来加上一个共享锁,因此不再支持一致性的非锁定读。这也是隔离级别3的一大特性。

总结

由于锁的概念非常重要,这里先讲了锁的概念、锁的类型、锁的信息查看、事务的隔离级别和区别,后面我们会继续说锁的算法、锁的三种问题和幻读、死锁和锁升级。

推荐学习:MySQL教程

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

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
MySQLの場所:データベースとプログラミングMySQLの場所:データベースとプログラミングApr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQL:中小企業から大企業までMySQL:中小企業から大企業までApr 13, 2025 am 12:17 AM

MySQLは、中小企業に適しています。 1)中小企業は、顧客情報の保存など、基本的なデータ管理にMySQLを使用できます。 2)大企業はMySQLを使用して、大規模なデータと複雑なビジネスロジックを処理して、クエリのパフォーマンスとトランザクション処理を最適化できます。

Phantomの読み取りとは何ですか?Innodbはどのようにそれらを防ぐ(次のキーロック)?Phantomの読み取りとは何ですか?Innodbはどのようにそれらを防ぐ(次のキーロック)?Apr 13, 2025 am 12:16 AM

INNODBは、次のキーロックメカニズムを通じてファントムの読み取りを効果的に防止します。 1)Next-KeyLockingは、Row LockとGap Lockを組み合わせてレコードとギャップをロックして、新しいレコードが挿入されないようにします。 2)実際のアプリケーションでは、クエリを最適化して分離レベルを調整することにより、ロック競争を削減し、並行性パフォーマンスを改善できます。

mysql:プログラミング言語ではありませんが...mysql:プログラミング言語ではありませんが...Apr 13, 2025 am 12:03 AM

MySQLはプログラミング言語ではありませんが、そのクエリ言語SQLにはプログラミング言語の特性があります。1。SQLは条件付き判断、ループ、可変操作をサポートします。 2。ストアドプロシージャ、トリガー、機能を通じて、ユーザーはデータベースで複雑な論理操作を実行できます。

MySQL:世界で最も人気のあるデータベースの紹介MySQL:世界で最も人気のあるデータベースの紹介Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

MySQLの重要性:データストレージと管理MySQLの重要性:データストレージと管理Apr 12, 2025 am 12:18 AM

MySQLは、データストレージ、管理、クエリ、セキュリティに適したオープンソースのリレーショナルデータベース管理システムです。 1.さまざまなオペレーティングシステムをサポートし、Webアプリケーションやその他のフィールドで広く使用されています。 2。クライアントサーバーアーキテクチャとさまざまなストレージエンジンを通じて、MySQLはデータを効率的に処理します。 3.基本的な使用には、データベースとテーブルの作成、挿入、クエリ、データの更新が含まれます。 4.高度な使用には、複雑なクエリとストアドプロシージャが含まれます。 5.一般的なエラーは、説明ステートメントを介してデバッグできます。 6.パフォーマンスの最適化には、インデックスの合理的な使用と最適化されたクエリステートメントが含まれます。

なぜMySQLを使用するのですか?利点と利点なぜMySQLを使用するのですか?利点と利点Apr 12, 2025 am 12:17 AM

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

InnoDBロックメカニズム(共有ロック、排他的ロック、意図ロック、レコードロック、ギャップロック、次のキーロック)を説明します。InnoDBロックメカニズム(共有ロック、排他的ロック、意図ロック、レコードロック、ギャップロック、次のキーロック)を説明します。Apr 12, 2025 am 12:16 AM

INNODBのロックメカニズムには、共有ロック、排他的ロック、意図ロック、レコードロック、ギャップロック、次のキーロックが含まれます。 1.共有ロックにより、トランザクションは他のトランザクションが読み取らないようにデータを読み取ることができます。 2.排他的ロックは、他のトランザクションがデータの読み取りと変更を防ぎます。 3.意図ロックは、ロック効率を最適化します。 4。ロックロックインデックスのレコードを記録します。 5。ギャップロックロックインデックス記録ギャップ。 6.次のキーロックは、データの一貫性を確保するためのレコードロックとギャップロックの組み合わせです。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。