[+/-]
InnoDB
トランザクションモデル内のゴールは、マルチバージョンデータベースの優れた性質を、従来の二相ロックと合体させることです。InnoDB
は、行レベルでロックを行い、デフォルトではクエリーを
Oracle
式の非ロックの一貫性読み取りとして実行します。InnoDB
のロックテーブルは領域効率の高い方法で格納されるため、ロックエスカレーションは不要です。複数のユーザーが
InnoDB
テーブルのあらゆるレコードまたはレコードのランダムなサブセットをロックすることができ、InnoDB
でメモリー不足が発生することもありません。
InnoDB
内では、すべてのユーザー行動はトランザクション内で起こります。もし自動コミットモードが有効なら、各
SQL
ステートメントはそれ自体の上に単一トランザクションを形作ります。MySQL
は、デフォルトで新しい接続のセッション開始時に自動コミットを有効にするため、各
SQL
ステートメントからエラーが返されなかった場合にそのステートメントのあとでコミットを行います。もしステートメントがエラーを返したら、コミットやロールバックの動作はそのエラーによって決まります。項9.12. 「InnoDB
エラー処理」
を参照してください。
自動コミットが有効になったセッションであれば、明示的な
STARTTRANSACTION
か
BEGIN
ステートメントを利用して複合ステートメントトランザクションを開始することでそれを実行し、また
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
オプションを使用します。遮断レベルやレベル設定構文の詳細については、項8.4.6. 「SET TRANSACTION
構文」
を参照してください。
行レベルロック内では、InnoDB
は通常、ネクストキーロックを利用します。これは、インデックスレコード以外に、InnoDB
が、別のセッションによってインデックスレコードの直前のギャップに挿入されることを防ぐために、インデックスレコードに先行する
「ギャップ」
をロックすることもできるということを意味します。ネクストキーロックは、インデックスレコードとその前のギャップをロックするロックを参照します。ギャップロックは、ただ単に、いくつかのインデックスレコードの前にギャップをロックするだけのロックを参照します。
行レベルロックや、ギャップロックが無効化される環境の詳細については、項9.8.4. 「InnoDB
レコード、ギャップ、およびネクストキーロック」
を参照してください。