あなたはここで間違いなく正しい軌道に乗っています。
InnoDB がコミットする必要があるトランザクションを実行するときは常に、2 フェーズ コミットとして実行されます。トランザクションは最初にこれらのログに書き込まれます。そして、そこからコミットされます。
これは、MySQL のクラッシュまたはサーバーのクラッシュが発生した場合に非常に役立ちます。
mysql を再起動すると、ib_logfile0 および ib_logfile1 内のすべてのコミットされていないエントリが、InnoDB のクラッシュ リカバリの一部として再生され、InnoDB が調和のとれた状態になります (これは、ACID コンプライアンスの一貫性と耐久性の部分です) 。
ib_logfile0 と ib_logfile1 を削除して mysql を開始すると、それらのファイルに含まれていたコミットされていないトランザクションはすべて失われます。クラッシュ リカバリ サイクル中にログ ファイルが見つからない場合は、 innodb_log_file_size設定に基づいて再生成されます。
InnoDB の詳細な説明については、MySQL のドキュメントを参照してください。
@karatedog InnoDB の MVCC 部分は、ibdata1 としてよく知られているシステム テーブルスペース内で発生します。トランザクションの開始前に表示されるデータはすべて記録され、必要な行にアクセスする他のユーザーが、更新が行われる前のデータを表示できるようにします。これにより、REPEATABLE-READ と呼ばれるものが可能になります。これは、ACID 準拠の I、Isolation に該当します。トランザクションの分離が良い、悪い、または醜いさまざまなシナリオに関して、DBA StackExchange にこれに関する投稿を書きました。
MyISAM に関しては、クラッシュ リカバリは自動ではありません。かなり簡単にクラッシュします。そのため、SQL コマンドREPAIR TABLE
が存在します。これが、オンラインでない MyISAM テーブルに対して実行するオプションがMySQL ユーティリティmyisamchk
にある理由でもあります。-r
REPAIR TABLE
MariaDB と Ariaは、MyISAM の代わりとしてクラッシュセーフなストレージ エンジンを作ろうとしてきました。