MySQL シリーズ 10 同時実行制御を実装するための MySQL トランザクション分離

MySQL シリーズ 10 同時実行制御を実装するための MySQL トランザクション分離

1.同時アクセス制御

実装されている同時アクセス制御テクノロジはロックに基づいています。

ロックは、テーブル レベルのロックと行レベルのロックに分けられます。MyISAM ストレージ エンジンは行レベルのロックをサポートしていませんが、InnoDB はテーブル レベルのロックと行レベルのロックをサポートしています。

ロックは読み取りロックと書き込みロックに分類されます。読み取りロックは共有ロックとも呼ばれます。読み取りロックが追加されると、他の人も読み取りが可能になります。書き込みロックは排他ロックまたは排他ロックとも呼ばれます。書き込みロックは他の読み取りおよび書き込み操作をブロックします。

ロックは暗黙的ロックと明示的ロックに分けられます。暗黙的ロックはストレージ エンジンによって管理され、明示的ロックはユーザーが手動で追加します。

ロック戦略: ロックの粒度とデータ セキュリティの間のバランス メカニズム。

明示的なロックの使用方法: LOCK TABLES tbl_name READ|WRITE

MariaDB [school]> LOCK TABLES students READ; #読み取りロックを追加
MariaDB [school]> テーブルのロック解除; #ロック解除

読み取りロック: 誰も書き込みできません

書き込みロック: 自分は読み書きできますが、他の人は読み書きできません

FLUSH TABLES tb_name : 開いているテーブルを閉じます(クエリキャッシュをクリアします)。通常はバックアップの前にグローバル読み取りロックを追加します。

SELECT句[FOR UPDATE | LOCK IN SHARE MODE]はクエリ中に書き込みまたは読み取りロックを追加します。

2. 取引

アトミックSQL文のセット、または独立した作業単位

1. トランザクションは ACID 原則に従います。

  • A: アトミック性。トランザクション全体のすべての操作は、正常に実行されるか、すべての失敗後にロールバックされます。
  • C: 一貫性。データベースは常に一貫性のある状態から別の一貫性のある状態に移行します。
  • I: 分離。トランザクションによって実行された操作は、コミットされるまで他のトランザクションから参照できません。同時実行性を実現するために複数のレベルの分離があります。
  • D: 耐久性。トランザクションがコミットされると、変更内容はデータベースに永続的に保存されます。

2. トランザクションライフサイクル

明示的なトランザクション: トランザクションの開始を明確に指定する

暗黙的なトランザクション: デフォルトは暗黙的なトランザクションで、各ステートメントが実行された後に直接コミットされます。

autocommit = {OFF|ON} は自動コミットをオンまたはオフにします。「自動コミット」機能を使用する代わりに、トランザクションを明示的に要求してコミットすることをお勧めします。

トランザクションを開始します: START TRANSACTION;

タグを挿入: ROLLBACK TO ##;

指定されたタグにロールバックします: ROLLBACK TO ##;

すべて元に戻す: ROLLBACK;

トランザクションをコミットします: COMMIT;

タグを削除: RELEASE SAVEPOINT;

MariaDB [school]> START TRANSACTION; #トランザクションの開始を明示的に指定しますMariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (26,'Tom',22,'M'); #レコードを追加しますMariaDB [school]> SAVEPOINT sp26; #ラベルを挿入しますMariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (27,'Maria',12,'F'); #別のレコードを追加しますMariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #確認すると、挿入されたデータが表示されます+-------+-------+--------+---------+----------+-----------+-----------+
| 生徒ID | 名前 | 年齢 | 性別 | クラスID | 教師ID |
+-------+-------+------+---------+----------+-----------+
| 26 | トム | 22 | 男性 | NULL | NULL |
| 27 | マリア | 12 | F | NULL | NULL |
+-------+-------+------+---------+----------+-----------+
MariaDB [school]> ROLLBACK TO sp26; #sp26 タグより前の状態に戻す MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #チェック、maria の情報は取り消されました+-------+------+-------+---------+----------+-----------+
| 生徒ID | 名前 | 年齢 | 性別 | クラスID | 教師ID |
+-------+------+------+--------+----------+-----------+
| 26 | トム | 22 | 男性 | NULL | NULL |
+-------+------+------+--------+----------+-----------+
MariaDB [school]> COMMIT; #トランザクションをコミット MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #最終データ+-------+------+------+---------+----------+-----------+
| 生徒ID | 名前 | 年齢 | 性別 | クラスID | 教師ID |
+-------+------+------+--------+----------+-----------+
| 26 | トム | 22 | 男性 | NULL | NULL |
+-------+------+------+--------+----------+-----------+

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

  • READ UNCOMMITTED 他のトランザクションはコミットされていないダーティデータを参照できるため、ダーティリードが発生します。
  • READ COMMITTED トランザクションがコミットされると、他のトランザクションは変更されたデータを見ることができます。毎回読み取られるデータは不整合になる可能性があり、繰り返し読み取ることはできません。
  • REPEATABLE READ 繰り返し読み取り。毎回表示されるデータは一貫しており、データが変更されると最新のデータは表示されず、ファントム読み取りが発生します (デフォルト設定)
  • SETIALIZABILE コミットされていない読み取りトランザクションは変更トランザクションをブロックし、シリアル実行、並行性の低下を引き起こします。

MVCC: トランザクションレベルに関連するマルチバージョン同時実行制御

トランザクション分離レベルを変更します。サーバー変数 tx_isolation で指定します。デフォルトは REPEATABLE-READ で、GLOBAL レベルと SESSION レベルで設定できます。

tx_isolation

  • 説明: トランザクション分離レベル。SET TRANSACTION ISOLATION LEVEL も参照してください。
  • コマンドライン: --transaction-isolation=name
  • 範囲: グローバル、セッション
  • ダイナミック: はい
  • タイプ: 列挙
  • デフォルト値: REPEATABLE-READ
  • 有効な値: READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE
MariaDB [school]> SELECT @@tx_isolation; #デフォルトは繰り返し読み取りレベルです+-----------------+
| @@tx_isolation |
+-----------------+
| 繰り返し読み取り |
+-----------------+
MariaDB [学校]> tx_isolation='READ-UNCOMMITTED' を設定します。
MariaDB [school]> tx_isolation='READ-COMMITTED' を設定します。
MariaDB [school]> tx_isolation='REPEATABLE-READ' を設定します。
MariaDB [school]> tx_isolation='SERIALIZABLE' を設定します。

4. 行き詰まり

2 つ以上のトランザクションが同じリソースを占有し、お互いが占有しているリソースのロックを要求すると、デッドロックが発生します。

トランザクション A がテーブル t1 の 3 行目を変更し、トランザクション B がテーブル t2 の 2 行目を変更すると、トランザクション A はテーブル t2 の 2 行目を変更するときにブロックされます。次に、トランザクション B はテーブル t1 の 3 行目を変更するときにブロックされ、デッドロックが発生します。

2 つのトランザクションが同時に互いの変更済みテーブルを変更しようとして、互いをブロックします。システムはデッドロックを検出し、デッドロックを解決するために低コストのトランザクションを自動的に犠牲にします。

エラー 1213 (40001): ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再起動してください。

プロセス リストを表示します: MariaDB [school]> SHOW PROCESSLIST;

プロセスを終了します: MariaDB [school]> KILL 5;

これで、MySQL シリーズ 10: MySQL トランザクション分離による同時実行制御の実装に関する記事は終了です。MySQL 同時実行制御の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

これで、MySQL シリーズ 10: MySQL トランザクション分離による同時実行制御の実装に関する記事は終了です。MySQL 同時実行制御の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL トランザクション機能を使用して同時かつ安全な自動増分 ID を実装する例
  • PHP+MySQL の高同時ロックトランザクション処理問題の解決方法
  • MySQL の繰り返し読み取りレベルでファントム読み取りを解決できますか?
  • MySQLがファントムリードを解決する方法の詳細な説明
  • MySQL トランザクション同時実行問題の解決
  • MySQL ファントムリードとその排除方法の詳細な説明
  • MySQL のファントムリード問題を解決する方法
  • mysql+mybatisはストアドプロシージャ+トランザクション+複数同時シリアル番号取得を実装します
  • Mysql トランザクションにおける同時ダーティ リード + 非反復リード + ファントム リードの詳細な説明

<<:  Linux スクリプトの基礎を詳しく紹介

>>:  HTML で複数のクラス属性を定義する場合の無効な解決策

推薦する

React を使って小さなプログラムを書くための Remax フレームワークのコンパイル プロセス分析 (推奨)

Remax は、実行時に構文制限のないソリューションを採用した React を使用して小規模なプロ...

クールなページング効果を実現するネイティブJS

この記事では、次のような効果を持つ JS ページング効果の例を紹介します。クールだと思いませんか? ...

pdf.js を使用して Vue で PDF ファイルをプレビューする方法

ページ上で PDF をプレビューすると、一部のファイルは印刷またはダウンロードできません。現時点では...

画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...

MySQLにおける時刻日付型と文字列型の選択について

目次1. DATETIMEとTIMESTAMPの使用1. 類似点2. 相違点3. 選択2. varc...

MySQL データベース 8 - データベース内の関数の適用の詳細な説明

データベースの組み込み関数の使用この記事では、主に日付関数、文字列関数、数学関数など、データベースの...

MySQL マスタースレーブ同期、トランザクションロールバックの実装原理

ビンログBinLog は、データベース テーブル構造の変更 (テーブルの作成、変更など) とテーブル...

Reactはグローバル箇条書きボックスメソッドをカプセル化します

この記事の例では、Reactカプセル化グローバルポップアップボックスの具体的なコードを参考までに共有...

Vue モバイル プロジェクトでページ キャッシュを実装する方法のサンプル コード

背景モバイル デバイスでは、ページ ジャンプ間のキャッシュが必須要件です。例: ホームページ =&g...

CentOS7.5 MySQLのインストールチュートリアル

1. まずシステムにmysqlがインストールされているかどうかを確認します rpm -qa | gr...

Vueの監視プロパティの詳細な説明

目次Vue モニターのプロパティリスナープロパティとは何ですか?リスニングプロパティと計算プロパティ...

Linux で Redis のリモート接続を実装する方法

LinuxにRedisをインストールしたら、Javaを使って接続します。Javaコードは次のとおりで...

MySQL におけるデフォルトの使用法の詳細な説明

NULL および NOT NULL 修飾子、DEFAULT 修飾子、AUTO_INCREMENT 修...

Hadoop におけるネームノードとセカンダリネームノードの動作メカニズムの説明

1) プロセス 2) FSImageと編集NodeNode は HDFS の頭脳です。ファイルシステ...

MySQLのREDOログとUNDOログの詳細な説明

MySQL ログ システムで最も重要なログは、REDO ログとアーカイブ ログです。後者は MySQ...