" ¿Dónde se almacenan los datos no confirmados, de modo que una transacción READ_UNCOMMITTED pueda leer datos no confirmados de otra transacción? "
Las nuevas versiones de registro no confirmado (PK agrupado) se tratan como la versión "actual" del registro en la página. Por lo tanto, se pueden almacenar en el grupo de búferes y / o en el espacio de tabla (por ejemplo, tablename.ibd). Las transacciones que luego necesitan construir una instantánea / vista en algo que no sea READ-UNCOMMITTED, necesitan construir una versión anterior de la fila (siguiendo la lista del historial) usando los registros UNDO (almacenados en el espacio de tabla del sistema ). Al leer el registro no confirmado, es posible que InnoDB también necesite leer algunos registros de índice secundario no confirmados del Change Buffer y aplicarlos antes de presentar el registro nuevamente al usuario.
Es este comportamiento el que puede hacer que las reversiones en InnoDB sean relativamente caras. Es el gran factor que también puede conducir a posibles problemas de rendimiento de transacciones inactivas de larga duración que tienen registros actualizados, ya que esas transacciones bloquearán las operaciones de purga y la lista de historial de versiones de registros antiguas aumenta, y los registros UNDO necesarios para reconstruir esas versiones antiguas a pedido, continuará creciendo. Ralentiza las nuevas transacciones que necesitan leer una versión anterior / comprometida del registro, ya que necesitan recorrer una lista de historial cada vez más larga, que es una lista individualmente vinculada de registros UNDO, y hacer más trabajo para reconstruir La versión anterior del registro. Entonces terminas usando muchos ciclos de CPU (sin mencionar las primitivas de bloqueo interno: mutexes, rw_locks, semáforos, etc.
Con suerte eso tiene sentido? :)
Como FYI, en MySQL 5.7 puede mover el espacio de tabla UNDO y los registros fuera del espacio de tabla del sistema , y hacerlos truncar automáticamente. Pueden crecer bastante si tiene una transacción de larga duración que impide las operaciones de purga, lo que resulta en una longitud de lista de historial muy larga y cada vez mayor. Tenerlos almacenados en el espacio de tabla del sistema fue la causa más común de un archivo ibdata1 enorme / en crecimiento, que a su vez no se puede truncar / encoger / aspirar para reclamar más tarde ese espacio.