トランザクションおよびロックは 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
ステートメントは、現在のトランザクションによって行われたすべての変更を取り消します。COMMIT
と ROLLBACK
は両方とも、現在のトランザクション中に設定されたすべての InnoDB
ロックを解除します。
SQL:1992 のトランザクション分離レベルに関しては、デフォルトの InnoDB
レベルは REPEATABLE READ
です。InnoDB
では、SQL 標準に記載された 4 つのトランザクション分離レベル (READ UNCOMMITTED
、READ COMMITTED
、REPEATABLE READ
、SERIALIZABLE
) がすべて提供されます。
ユーザーは SET TRANSACTION
ステートメントを使用して単一のセッションまたは後続のすべての接続の分離レベルを変更できます。すべての接続に対するサーバーのデフォルトの分離レベルを設定するには、コマンド行上、またはオプションファイル内で --transaction-isolation
オプションを使用します。分離レベルおよびレベル設定構文についての詳細は、セクション13.3.6「SET TRANSACTION 構文」を参照してください。
InnoDB
では、通常、行レベルロックでネクストキーロックが使用されます。つまり、InnoDB
はインデックスレコードのほかに、インデックスレコードの前のギャップもロックすることで、インデックス付きの値がツリーデータ構造内のそのギャップに挿入されるその他のセッションによって挿入されることをブロックできます。ネクストキーロックは、インデックスレコードとその前のギャップをロックするロックを参照します。ギャップロックは、いくつかのインデックスレコードの前のギャップのみをロックするロックを参照します。
行レベルロック、およびギャップロックが無効になる状況についての詳細は、セクション14.2.6「InnoDB のレコード、ギャップ、およびネクストキーロック」を参照してください。