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.2.2 InnoDB のトランザクションモデルおよびロック

トランザクションおよびロックは InnoDB ストレージエンジンに関連するため、大規模、高負荷、または高信頼性のデータベースアプリケーションを実装したり、別のデータベースシステムから大量のコードを移植したり、MySQL のパフォーマンスを調整したりするには、これらの概念を理解する必要があります。

InnoDB トランザクションモデルの目標は、マルチバージョンデータベースの最高の特性を従来の二相ロックと組み合わせることです。InnoDB は、行レベルでロックを行い、デフォルトではクエリーを Oracle 式の非ロックの一貫性読み取りとして実行します。InnoDB のロック情報は非常に高い空間効率で格納されるため、ロックのエスカレーションは必要ありません。一般に、何人かのユーザーは、InnoDB テーブル内のすべての行、または行のランダムなサブセットをロックすることが許可されています。これにより、InnoDB のメモリーが使い果たされることはありません。

InnoDB では、すべてのユーザーアクティビティーがトランザクション内部で発生します。自動コミットモードが有効になっている場合は、各 SQL ステートメント自体に単一のトランザクションが生成されます。MySQL は、デフォルトで新しい接続のセッション開始時に自動コミットを有効にするため、各 SQL ステートメントからエラーが返されなかった場合に、そのステートメントのあとでコミットを実行します。ステートメントからエラーが返された場合、コミットまたはロールバックの動作はそのエラーによって異なります。セクション14.19.4「InnoDB のエラー処理」を参照してください。

自動コミットが有効になっているセッションでは、明示的な START TRANSACTION または BEGIN ステートメントで起動し、COMMIT または ROLLBACK ステートメントで終了することで、複数ステートメントのトランザクションを実行できます。セクション13.3.1「START TRANSACTION、COMMIT、および ROLLBACK 構文」を参照してください。

SET autocommit = 0 でセッション内の自動コミットモードを無効にすると、そのセッションでは常にトランザクションが開かれた状態になります。COMMIT または ROLLBACK ステートメントは現在のトランザクションを終了し、新しいセッションを開始します。

COMMIT は、現在のトランザクション内で行われた変更は永続的であり、その他のセッションから表示できることを意味します。反対に、ROLLBACK ステートメントは、現在のトランザクションによって行われたすべての変更を取り消します。COMMITROLLBACK は両方とも、現在のトランザクション中に設定されたすべての InnoDB ロックを解除します。

SQL:1992 のトランザクション分離レベルに関しては、デフォルトの InnoDB レベルは REPEATABLE READ です。InnoDB では、SQL 標準に記載された 4 つのトランザクション分離レベル (READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE) がすべて提供されます。

ユーザーは SET TRANSACTION ステートメントを使用して単一のセッションまたは後続のすべての接続の分離レベルを変更できます。すべての接続に対するサーバーのデフォルトの分離レベルを設定するには、コマンド行上、またはオプションファイル内で --transaction-isolation オプションを使用します。分離レベルおよびレベル設定構文についての詳細は、セクション13.3.6「SET TRANSACTION 構文」を参照してください。

InnoDB では、通常、行レベルロックでネクストキーロックが使用されます。つまり、InnoDB はインデックスレコードのほかに、インデックスレコードの前のギャップもロックすることで、インデックス付きの値がツリーデータ構造内のそのギャップに挿入されるその他のセッションによって挿入されることをブロックできます。ネクストキーロックは、インデックスレコードとその前のギャップをロックするロックを参照します。ギャップロックは、いくつかのインデックスレコードの前のギャップのみをロックするロックを参照します。

行レベルロック、およびギャップロックが無効になる状況についての詳細は、セクション14.2.6「InnoDB のレコード、ギャップ、およびネクストキーロック」を参照してください。


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.