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

推薦する

Linux でジャンクファイルをエレガントに削除する方法

あなたも私と同じように、コンピューターのファイルを整然と整理し、不要なファイルを適宜削除するプログラ...

CSS 属性を使用してマウス イベントをブロックする方法 (マウス クリックは上位の要素を貫通する可能性があります)

由来: 数日前、テスターから写真を見るという要件が送られてきました。 この要件を見たとき、私は少し混...

MySql5.x を MySql8.x にアップグレードする方法と手順

MySQL 5.x と MySQL 8.0.X のいくつかの違いapplication.proper...

CentOS仮想マシンの時刻を変更する方法

上はシステム時間、下はハードウェア時間です。ここでは変更を加えているので、同じくらいの速さになってい...

Vueがビデオアップロード機能を実装

この記事では、参考までに、ビデオアップロード機能を実現するためのVueの具体的なコードを紹介します。...

Ubuntu での MySQL および MySQL Workbench のインストール チュートリアル

Ubuntu に jdk をインストールする: [リンク] UbuntuにEclipseをインストー...

CSS3 列を使用したカード ウォーターフォール レイアウトを実装するためのサンプル コード

この記事では、カード ウォーターフォール レイアウトを実現するための CSS3 列のサンプル コード...

Nodejsはgitee実装コードに自動的に同期するドキュメント同期ツールを作成します

本来の意図このツールを作った理由は、コンピューターを使用しているときにいつでも毎日の仕事や生活を記録...

解析を実装するためにPostgreSQLデータベースを書き込むSQLスクリプト関数

この記事は主に、PostgreSQL データベースを記述して解析を実装する SQL スクリプト関数を...

Gitlab実践チュートリアルでは、関連する設定操作にgit configを使用します。

この記事では、実際に発生した問題をもとに、git の設定に関する内容を紹介します。コマンド: git...

Vue 名前付きスロットの基本的な使用例

序文名前付きスロットは、スロット内の「name」属性を使用して要素にバインドされます。知らせ: 1....

VUE ユニアプリカスタムコンポーネントについての簡単な説明

1. 親コンポーネントはpropsを通じて子コンポーネントにデータを渡すことができる2. 子コンポー...

mysql8.0.11 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

mysql 8.0.11 winx64のインストールチュートリアルは以下のように記録され、みんなと...

高さ:100% が機能しないのはなぜですか?

高さ:100% が機能しないのはなぜですか?この知識は不人気ではありませんが、使用する際には混乱する...

JavaScript の new 演算子を自分で実装する方法

目次コンストラクタ新しいオペレーター自分で新しいものを実装するコンストラクタnew を導入する前に、...