Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
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
Sign Up Login You must be logged in to post a comment.