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 で複数のクラス属性を定義する場合の無効な解決策

推薦する

JS 正規マッチングの落とし穴の記録

最近、JS の正規表現マッチングの落とし穴を発見したのですが、その時はあまりにも奇妙だったので、何か...

Mybatis での動的 SQL ステートメント分析

この記事は主にMybatisでの動的SQL文の解析について紹介します。この記事のサンプルコードは非常...

CentOS7にMySQL 8.0.26をインストールする手順

1. まず、お使いのマシンに応じて、MySQL 公式サイトから対応するデータベースをダウンロードしま...

リクエストを転送したり、静的リソースファイルにアクセスしたりする複数の場所への nginx の実装

この記事では主に、リクエストを転送したり、静的リソース ファイルにアクセスしたりする nginx の...

適応幅(パーセンテージ)に応じて Div の高さを調整する純粋な CSS

今日のレスポンシブ レイアウトの要件では、サイズを自動的に調整できる多くの要素で高さと幅の適応を実現...

DOCTYPE 文書型宣言 (Web ページ愛好家必読)

DOCTYPE 宣言 作成するすべてのページの先頭に、ドキュメント宣言が必要です。はい、そうでしょう...

mysql 複数テーブル接続削除関数の削除

単一のテーブルを削除する: tableName から columnName = value を削除し...

in() の ID の順序に従った Mysql クエリ結果の順序の詳細な説明

in() の ID の順序に従った Mysql クエリ結果の順序の詳細な説明コード例: <se...

3つの主要データベース(Mysql、SqlServer、Oracle)の違いについて簡単に説明します。

マイグレーションアドバンテージ:小型、高速、総所有コストが低い、オープンソース。複数のオペレーティン...

Docker Swarm クラスタ管理の使用と原理の分析

Swarm クラスター管理導入Docker Swarm は Docker 用のクラスター管理ツールで...

border-image を使用してテキストバブルの境界線を実装する方法のサンプルコード

開発中に、非常に単純なテキストバブル効果に遭遇しました。これは、おおよそ次のようになります。 うーん...

Linux システムでの nginx サーバーのインストールと負荷分散構成の詳細な説明

nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバー、メール プ...

Docker を使用して Go Web アプリケーションをデプロイする方法

目次なぜ Docker が必要なのでしょうか? Docker デプロイメントの例コードの準備Dock...

mysql8.0.19 の基本データ型の詳細な説明

MySQL 基本データ型一般的な MySQL データ型の概要 ![1036857-201708011...

広告を閉じる効果を実現するJavascript

参考までに、Javascript を使用して広告を閉じる方法に関するケース スタディを示します。詳細...