InnoDB
では、読取り専用として認識されているトランザクションの transaction ID (TRX_ID
フィールド) の設定に関連するオーバーヘッドを回避できます。 トランザクション ID は、書き込み操作またはロック読み取り (SELECT ... FOR UPDATE
など) を実行する可能性のあるトランザクションにのみ必要です。 不要なトランザクション ID を排除すると、クエリーまたはデータ変更ステートメントが read view を構成するたびに参照される内部データ構造のサイズが削減されます。
InnoDB
は、次の場合に読取り専用トランザクションを検出します:
-
トランザクションが
START TRANSACTION READ ONLY
ステートメントで開始された場合。 この場合は、データベース (InnoDB
、MyISAM
、またはその他のタイプのテーブル) に対して変更を行おうとするとエラーが発生し、そのトランザクションは読み取り専用状態のままになります。ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
ただし、読み取り専用トランザクションでのセッション固有の一時テーブルの変更や、それらのテーブルに対するロッククエリーの発行は、その変更やロックがほかのどのトランザクションにも表示されないため引き続き可能です。
autocommit
設定がオンになっているため、トランザクションが 1 つのステートメントであることが保証され、そのトランザクションを構成している 1 つのステートメントが「非ロック」のSELECT
ステートメントである場合。 つまり、FOR UPDATE
またはLOCK IN SHARED MODE
句を使用しないSELECT
です。トランザクションは
READ ONLY
オプションなしで開始されますが、行を明示的にロックする更新またはステートメントはまだ実行されていません。 更新または明示的ロックが必要になるまで、トランザクションは読取り専用モードのままです。
したがって、レポートジェネレータなどの読取り集中型アプリケーションの場合は、START TRANSACTION READ ONLY
および COMMIT
内でグループ化するか、SELECT
ステートメントを実行する前に autocommit
設定をオンにするか、単にクエリーと混在するデータ変更ステートメントを回避することで、一連の InnoDB
クエリーをチューニングできます。
START TRANSACTION
および autocommit
については、セクション13.3.1「START TRANSACTION、COMMIT および ROLLBACK ステートメント」を参照してください。
自動コミット、非ロック、および読み取り専用 (AC-NL-RO) として承認されたトランザクションは、InnoDB
の特定の内部データ構造から除外されるため、SHOW ENGINE INNODB STATUS
の出力には表示されません。