あなたが尋ねた
READ_UNCOMMITTEDトランザクションがコミットされていないデータを別のトランザクションから読み取ることができるように、コミットされていないデータはどこに保存されますか?
あなたの質問に答えるためには、InnoDBアーキテクチャがどのように見えるかを知る必要があります。
次の画像は、Percona CTO Vadim Tkachenkoによって数年前に作成されました
InnoDBトランザクションモデルとロックに関するMySQLドキュメントによると
COMMITは、現在のトランザクションで行われた変更が永続的に行われ、他のセッションから見えるようになることを意味します。一方、ROLLBACKステートメントは、現在のトランザクションによって行われたすべての変更をキャンセルします。COMMITとROLLBACKはどちらも、現在のトランザクション中に設定されたすべてのInnoDBロックを解放します。
COMMITとROLLBACKはデータの可視性を管理するため、READ COMMITTEDとREAD UNCOMMITTEDは変更を記録する構造とメカニズムに依存する必要があります
- ロールバックセグメント/スペースを元に戻す
- ログのやり直し
- 関係するテーブルに対するギャップロック
ロールバックセグメントと元に戻すスペースは、変更が適用される前に、変更されたデータがどのように見えるかを認識します。REDOログは、データが更新されたように見えるようにするためにロールフォワードされる変更を認識します。
あなたも尋ねました
READ_COMMITTEDトランザクションがコミットされていないデータを読み取ることができない、つまり「ダーティリード」を実行できないのはなぜですか。この制限を強制するメカニズムは何ですか?
ログのやり直し、スペースの取り消し、ロックされた行が機能します。InnoDBバッファープール(innodb_max_dirty_pages_pct、innodb_buffer_pool_pages_dirtyおよびinnodb_buffer_pool_bytes_dirtyでダーティページを測定できる場所)も考慮する必要があります。
これに照らして、READ COMMITTEDは、どのようなデータが永続的に表示されるかを認識します。したがって、コミットされなかったダーティページを探す必要はありません。READ COMMITEDは、コミットされたダーティーリードにすぎません。READ UNCOMMITTEDは、どの行がロックされ、どのREDOログがデータを表示するために読み取られるか無視されるかを継続的に認識していました。
分離を管理するための行のロックを完全に理解するには、InnoDBトランザクションモデルとロックをお読みください。