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 原則に従います。
2. トランザクションライフサイクル明示的なトランザクション: トランザクションの開始を明確に指定する 暗黙的なトランザクション: デフォルトは暗黙的なトランザクションで、各ステートメントが実行された後に直接コミットされます。 autocommit = {OFF|ON} は自動コミットをオンまたはオフにします。「自動コミット」機能を使用する代わりに、トランザクションを明示的に要求してコミットすることをお勧めします。 トランザクションを開始します: タグを挿入: 指定されたタグにロールバックします: すべて元に戻す: トランザクションをコミットします: タグを削除: 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. トランザクション分離レベル
MVCC: トランザクションレベルに関連するマルチバージョン同時実行制御 トランザクション分離レベルを変更します。サーバー変数 tx_isolation で指定します。デフォルトは REPEATABLE-READ で、GLOBAL レベルと SESSION レベルで設定できます。
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 つのトランザクションが同時に互いの変更済みテーブルを変更しようとして、互いをブロックします。システムはデッドロックを検出し、デッドロックを解決するために低コストのトランザクションを自動的に犠牲にします。
プロセス リストを表示します: プロセスを終了します: これで、MySQL シリーズ 10: MySQL トランザクション分離による同時実行制御の実装に関する記事は終了です。MySQL 同時実行制御の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 これで、MySQL シリーズ 10: MySQL トランザクション分離による同時実行制御の実装に関する記事は終了です。MySQL 同時実行制御の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: HTML で複数のクラス属性を定義する場合の無効な解決策
nginx.conf で複数のサーバーを設定します。 http リクエストを処理する際、nginx ...
目次1. はじめに2. Viteプロジェクトを作成する1. viteをインストールする2. プロジェ...
1. はじめにDocker には、タスクを構成する複数の Docker コンテナをオーケストレーショ...
MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...
質問:最近、プロジェクトの統計を行っていたときに、テーブルを上下にスクロールしたときにテーブルの先頭...
この記事では、オブジェクト パラメータをインスタンス化して MySQL でデータをクエリする方法を紹...
前提条件: nginx には、ngx_http_limit_conn_module モジュールと n...
日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...
目次ファーストルックインデックスインデックスの概念インデックスファイルの構成インデックスの役割SQL...
MYSQLの解凍バージョンがインストールされます1: 解凍後、my.ini ファイルをコピーし、バイ...
目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...
はじめに以前は、Docker イメージは Azure のコンテナー レジストリに保存されていました。...
シェルを起動する頻度は非常に低いですが。 。 。しかし、書くたびに、多くの jar ファイル パスを...
目次1. 関連するbinlog設定2. binlogに関する詳細設定2.1 バイナリログモードの変更...
目次序文1. ファイルのディスク使用量を確認する1.1 ディスク容量の使用状況を確認する1.2 ディ...