Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  InnoDB トランザクションおよびロックテーブルのデータ永続性および一貫性

14.14.2.3 InnoDB トランザクションおよびロックテーブルのデータ永続性および一貫性

トランザクションおよびロックテーブル (INNODB_TRXINNODB_LOCKS、および INNODB_LOCK_WAITS) によって公開されるデータは、すばやく変更されるデータへの参照を表します。これは、アプリケーションで開始された更新が発生した場合にのみデータが変更されるほかの (ユーザー) テーブルとは異なります。ベースとなるデータはシステムで管理される内部データであり、非常にすばやく変更されることがあります。

パフォーマンス上の理由から、また InnoDB トランザクションとロック中の INFORMATION_SCHEMA テーブルの間の JOIN が誤って解釈される可能性を最小限に抑えるために、いずれかのテーブルに対して SELECT が発行されると常に、InnoDB は必要なトランザクションおよびロック情報を中間バッファーに収集します。このバッファーは、最後に読み取られてから 0.1 秒を超える時間が経過した場合にのみリフレッシュされます。3 つのテーブルを満たすために必要なデータは原子的に、かつ整合性を保ってフェッチされ、このグローバルな内部バッファー内に保存されて、ポイントインタイムスナップショットを形成します。複数のテーブルアクセスが 0.1 秒以内に発生した場合は (MySQL がこれらのテーブル間の結合を処理する場合は、ほぼ間違いなく発生します)、クエリーを満たすために同じスナップショットが使用されます。

これらのいずれかのテーブルを 1 つのクエリーにまとめる JOIN を実行した場合は、3 つのテーブルのデータが同じスナップショットから取得されるため、正しい結果が返されます。バッファーはこれらのテーブルのクエリーごとにはリフレッシュされないため、これらのテーブルに対して 10 分の 1 秒以内に個別のクエリーを発行した場合は、クエリーごとの結果が同じになります。これに対して、10 分の 1 秒を超える時間離れて発行された同じテーブルまたは異なるテーブルの 2 つの個別のクエリーでは、データが異なるスナップショットから取得されるため、異なる結果が表示される可能性があります。

トランザクションおよびロックデータが収集されている間 InnoDB は一時的に停止する必要があるため、これらのテーブルのクエリーを頻繁に実行しすぎると、ほかのユーザーから見たパフォーマンスに悪影響を与える場合があります。

これらのテーブルには機密情報 (少なくとも INNODB_LOCKS.LOCK_DATA および INNODB_TRX.TRX_QUERY) が含まれているため、セキュリティー上の理由から、そこからの SELECT を許可されるのは PROCESS 権限を持つユーザーだけです。

14.14.2.3.1 PROCESSLIST データとの不整合の可能性

セクション14.14.2.3「InnoDB トランザクションおよびロックテーブルのデータ永続性および一貫性」で説明されているように、InnoDB トランザクションおよびロックテーブル (INNODB_TRXINNODB_LOCKS、および INNODB_LOCK_WAITS) を満たすデータは自動的にフェッチされ、ポイントインタイムスナップショットを提供する中間バッファーに保存されます。同じスナップショットからクエリーされた場合、データは 3 つのすべてのテーブルにわたって整合性があります。ただし、ベースとなるデータが非常にすばやく変更されるため、同様にすばやく変更されるほかのデータへの同様の参照が同期していない可能性があります。そのため、InnoDB トランザクションおよびロックテーブル内のデータを PROCESSLIST テーブル内のデータと比較する場合は注意してください。PROCESSLIST テーブルからのデータは、ロックおよびトランザクションに関するデータと同じスナップショットからは取得されません。1 つの SELECT (たとえば、INNODB_TRXPROCESSLIST の結合) を発行した場合でも、一般に、これらのテーブルの内容には整合性がありません。INNODB_TRXPROCESSLIST 内には存在しない行を参照したり、INNODB_TRX.TRX_QUERY に示されている、トランザクションの現在実行中の SQL クエリーが PROCESSLIST.INFO 内のものとは異なっていたりする可能性があります。


User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
Sign Up Login You must be logged in to post a comment.