ホームページ  >  記事  >  データベース  >  MySQL 構文分析テーブルのロック

MySQL 構文分析テーブルのロック

WBOY
WBOY転載
2022-06-14 12:06:361845ブラウズ

この記事では、mysql に関する関連知識を提供します。主に、テーブル ロックに関する関連構文分析を紹介します。MySQL では、クライアント セッションが明示的にテーブル ロックを取得して、他のセッションが特定のテーブル内で同じテーブルにアクセスするのを防ぐことができます。皆さんの参考になれば幸いです。

MySQL 構文分析テーブルのロック

推奨学習: mysql ビデオ チュートリアル

MySQL テーブル ロック

ロックは、テーブル。 MySQL では、クライアント セッションがテーブル ロックを明示的に取得して、他のセッションが特定の期間同じテーブルにアクセスできないようにすることができます。クライアント セッションは、それ自体に対してのみテーブル ロックを取得または解放できます。他のセッションのテーブル ロックを取得または解放することはできません。

CREATE TABLE tbl (
  id INT NOT NULL AUTO_INCREMENT,
  col INT NOT NULL,
  PRIMARY KEY (id)) Engine = InnoDB;

LOCK および UNLOCK TABLES 構文

次のステートメントは明示的にテーブル ロックを取得します。

LOCK TABLES table_name [READ | WRITE]

テーブルをロックするには、LOCK TABLES キーワードの後に​​その名前を指定します。さらに、ロックのタイプ (読み取りまたは書き込み) を指定できます。

テーブル ロックを解放するには、次のステートメントを使用してください:

UNLOCK TABLES;

Read lock

READ ロックには次の特性があります:

  1. READ複数のセッションが同時にテーブル ロックを取得します。さらに、他のセッションは、ロックを取得せずにテーブルからデータを読み取ることができます。
  2. READ ロックを保持しているセッションは、テーブル内のデータの読み取りのみが可能ですが、書き込みはできません。さらに、READ がロックを解放するまで、他のセッションはテーブルにデータを書き込むことができません。別のセッションからの書き込み操作は、READ ロックが解放されるまで待機状態になります。
  3. セッションが正常または異常終了した場合、MySQL は暗黙的にすべてのロックを解放します。この機能は WRITE ロックにも関連しています。

例:
最初のセッションでは、次に示すように、まず mysqldemo データベースに接続し、CONNECTION_ID() 関数を使用して現在の接続 ID を取得します。

SELECT CONNECTION_ID();

MySQL 構文分析テーブルのロック
次に、tbl テーブルに新しい行を挿入します。

INSERT INTO tbl(col) VALUES(10);

次に、tbl テーブル内のデータをクエリします。

SELECT * FROM tbl;

MySQL 構文分析テーブルのロック
その後、ロックを取得するには、LOCK TABLE ステートメントを使用します。

LOCK TABLE tbl READ;

最後に、同じセッション内で tbl テーブルに新しい行を挿入しようとすると、エラー メッセージが表示されます。

INSERT INTO tbl(col) VALUES(11);

MySQL 構文分析テーブルのロック
したがって、READ がロックを取得すると、同じセッション内のテーブルにデータを書き込むことはできません。

別のセッションからロックを確認します。
まず、mysqldemo に接続し、接続 ID を確認します:

SELECT CONNECTION_ID();

MySQL 構文分析テーブルのロック
次に、TBL テーブルからデータを取得します:

SELECT * FROM tbl;

MySQL 構文分析テーブルのロック
次に、TBL テーブルに新しい行を挿入します。

INSERT INTO tbl(col) VALUES(20);

MySQL 構文分析テーブルのロック
最初のセッション READ が TBL テーブルのロックを取得しているため、2 番目のセッションからの挿入操作は待機しています。まだリリースされていません。

SHOW PROCESSLISTから詳細情報を確認できます。

SHOW PROCESSLIST;

MySQL 構文分析テーブルのロック
その後、最初のセッションに戻り、UNLO​​CK TABLES ステートメントを使用してロックを解放します。 READ が最初のセッションのロックを解放した後、INSERT が 2 番目のセッションで操作を実行します。

unlock tables;

最後に、tbl テーブルのデータをチェックして、2 番目のセッションの INSERT 操作が実際に実行されたかどうかを確認します。

SELECT * FROM tbl;

MySQL 構文分析テーブルのロック

書き込みロック

書き込みロックには次の特性があります:

  1. テーブル ロックを保持している唯一のセッションが読み取ることができます。テーブル データのフェッチと書き込み。
  2. 他のセッションは、WRITE ロックが解放されるまで、テーブルからデータを読み取ったりテーブルにデータを書き込んだりすることはできません。

まず、WRITE は最初のセッションからロックを取得します。

LOCK TABLE tbl WRITE;

その場合、TBL テーブル

INSERT INTO tbl(col) VALUES(11);

に新しい行を挿入すると便利です。

次に、tbl テーブルからデータを読み取ります。

SELECT * FROM tbl;

MySQL 構文分析テーブルのロック

それも機能します。

その後、2 番目のセッションから始めて、データの書き込みと読み取りを試みます:

INSERT INTO tbl(col) VALUES(21);
 SELECT * FROM tbl;

MySQL 構文分析テーブルのロック
MySQL 構文分析テーブルのロック

最后,从第一个会话中释放锁定。

UNLOCK TABLES;

看到第二个会话中的所有待处理操作都已执行,下图说明了结果:
MySQL 構文分析テーブルのロック

读锁与写锁

  1. 读锁是“共享”锁,它可以防止正在获取写锁,但不能锁定其他读锁。
  2. 写锁是“独占”锁,可以防止任何其他类型的锁。

推荐学习:mysql视频教程

以上がMySQL 構文分析テーブルのロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。