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

推薦する

ベースリンクタグの使用の紹介ベース

<br />リンクをクリックすると、ポップアップ表示される Web ページ アドレスは ...

JSはプログレスバーのスムーズバージョンの詳細な計画を実装します

進捗バーがスムーズではないフロントエンドを学ぶ学生のほとんどは、オーディオプレーヤーやビデオプレーヤ...

Linux コマンドラインで他のユーザーと通信する方法

Linux のコマンドラインで他のユーザーにメッセージを送信するのは簡単です。これを行うコマンドは多...

tdが空の場合に境界線を表示する方法

以前、CSS を使用してテーブルの border + bordercolordark + borde...

MySQL での重複キー更新時の replace into と insert into の使用法と相違点の分析

この記事では、MySQL での重複キー更新時の replace into と insert into...

Mysql Explainコマンドの使用と分析

mysql explain コマンドは、MySQL がインデックスを使用して選択ステートメントを処理...

Reactは感情を使ってCSSコードを書く

目次導入:感情のインストール:一般的な CSS コンポーネントを追加します。既存のコンポーネントにス...

Tomcat 例外の解決方法 (リクエスト ターゲットに無効な文字が見つかりました。有効な文字は RFC 7230 および RFC 3986 で定義されています)

1. シナリオ表示Tomcat ログに次の例外情報が時々報告されます。何が起こっているのでしょうか...

HTML 要素 (タグ) とその使用法

a : ハイパーリンクの開始位置または宛先位置を示します。頭字語: 単語の最初の文字からなる略語を示...

MySQL 5.7 でデータベースのデータ保存場所を変更する方法

MySQL データベースに保存されるデータが徐々に増加すると、元のストレージ領域がいっぱいになり、M...

CSS コンテナ背景 10 色グラデーション デモ (linear-gradient())

文法 背景: linear-gradient(direction,color-stop1,color...

HTML チュートリアル: 順序なしリスト

<br />原文: http://andymao.com/andy/post/102.h...

Oracle VM VirtualBox の CentOS7 オペレーティング システムのインストール チュートリアル図

目次インストール手順環境設定実行構成インストール手順ダウンロードアドレス: バージョン6.0 最初に...

Ubuntu で nginx を使用して WebDAV ファイル サーバーを構築する詳細なプロセス

nginxをインストールするnginx-fullをインストールする必要があることに注意してください。...

Windows はリモート デスクトップが長時間自動的に切断されるのを防ぎます

Windows リモート デスクトップを使用してサーバーに接続したことがある人なら、リモート デスク...