" Di mana data yang tidak terikat disimpan, sedemikian sehingga transaksi READ_UNCOMMITTED dapat membaca data yang tidak terikat dari transaksi lain? "
Versi catatan tanpa komitmen baru (PK berkerumun) diperlakukan sebagai versi "saat ini" dari catatan di halaman. Jadi mereka dapat disimpan di buffer pool dan / atau di tablespace (misalnya tablename.ibd). Transaksi yang kemudian perlu membuat snapshot / tampilan dalam apa pun selain BACA-TIDAK DIKOMITMEN, perlu membuat versi baris sebelumnya (mengikuti daftar riwayat) menggunakan catatan UNDO (disimpan dalam tablespace sistem ). Saat membaca catatan tidak berkomitmen, InnoDB mungkin juga perlu membaca beberapa catatan indeks sekunder yang tidak terikat dari Change Buffer dan menerapkannya sebelum menyajikan catatan kembali ke pengguna.
Perilaku inilah yang dapat membuat rollbacks di InnoDB relatif mahal. Ini adalah faktor besar yang juga dapat menyebabkan masalah kinerja potensial dari transaksi lama yang berjalan yang menyimpan catatan yang diperbarui, karena transaksi tersebut akan memblokir operasi pembersihan dan daftar riwayat versi catatan lama tumbuh, dan catatan UNDO diperlukan untuk membangun kembali versi lama tersebut. on-demand, akan terus tumbuh. Ini memperlambat transaksi baru yang perlu membaca versi yang lebih lama / berkomitmen dari catatan, karena mereka perlu menelusuri daftar sejarah yang lebih lama dan lebih lama - yang merupakan daftar tunggal yang terkait catatan UNDO - dan melakukan lebih banyak pekerjaan untuk merekonstruksi versi lama dari catatan. Jadi Anda akhirnya menggunakan banyak siklus CPU (belum lagi primitif penguncian internal: mutex, rw_locks, semaphores, dll.
Semoga itu masuk akal? :)
Sebagai FYI, di MySQL 5.7 Anda dapat memindahkan tablespace UNDO dan log out dari tablespace sistem , dan membuatnya terpotong secara otomatis. Mereka dapat tumbuh cukup besar jika Anda memiliki transaksi berjalan lama yang mencegah operasi pembersihan, menghasilkan panjang daftar sejarah yang sangat panjang dan terus bertambah. Setelah disimpan di tablespace sistem adalah satu-satunya penyebab paling umum dari file ibdata1 yang besar / berkembang, yang pada gilirannya tidak dapat terpotong / menyusut / disedot untuk kemudian mendapatkan kembali ruang itu.