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

推薦する

ドメイン名を nginx サービスにバインドする方法

nginx.conf で複数のサーバーを設定します。 http リクエストを処理する際、nginx ...

Vite+ElectronでVUE3デスクトップアプリケーションを素早く構築

目次1. はじめに2. Viteプロジェクトを作成する1. viteをインストールする2. プロジェ...

Docker Swarm サービス オーケストレーション コマンドの詳細な説明

1. はじめにDocker には、タスクを構成する複数の Docker コンテナをオーケストレーショ...

MySQL 5.7 でルートパスワードを変更する方法

MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...

テーブルの4辺を上下左右にスクロールするように固定する方法

質問:最近、プロジェクトの統計を行っていたときに、テーブルを上下にスクロールしたときにテーブルの先頭...

インスタンス化されたオブジェクトパラメータによるMySQLクエリ例の説明

この記事では、オブジェクト パラメータをインスタンス化して MySQL でデータをクエリする方法を紹...

Nginx の http リソース リクエスト制限の詳細な説明 (3 つの方法)

前提条件: nginx には、ngx_http_limit_conn_module モジュールと n...

SQLでEXPLAINコマンドを使用する方法

日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...

データベースインデックスの知識ポイントの概要

目次ファーストルックインデックスインデックスの概念インデックスファイルの構成インデックスの役割SQL...

MYSQL の解凍版における中国語の文字化け問題の解決方法

MYSQLの解凍バージョンがインストールされます1: 解凍後、my.ini ファイルをコピーし、バイ...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...

Dockerレジストリイメージ同期の実装アイデア

はじめに以前は、Docker イメージは Azure のコンテナー レジストリに保存されていました。...

Linux の一般的な Java プログラム起動スクリプトのコード例

シェルを起動する頻度は非常に低いですが。 。 。しかし、書くたびに、多くの jar ファイル パスを...

Mysql binlog ログファイルが大きすぎる場合の解決策

目次1. 関連するbinlog設定2. binlogに関する詳細設定2.1 バイナリログモードの変更...

MySQLのスペースをクリーンアップするいくつかの具体的な方法

目次序文1. ファイルのディスク使用量を確認する1.1 ディスク容量の使用状況を確認する1.2 ディ...