a instrucción @InnoDB SELECT ... FOR UPDATE bloquea todas las filas de una tabla

MySQL Server versión 5.1.41 con el complemento InnoDB habilitado. Tengo las siguientes tres tablas para facturas: facturas, factura_componentes y factura_expensas. Las facturas de la tabla tienen la clave principal invoice_id. Tanto invoice_components como invoice_expenses están vinculados a las facturas de la tabla con invoice_id como una clave extranjera no única (cada factura puede tener más de un componente y más de un gasto). Ambas tablas tienen un índice BTREE para esta clave externa.

Tengo las siguientes transacciones:

transaction 1

START TRANSACTION; 
SELECT * FROM invoices WHERE invoice_id = 18 FOR UPDATE; 
SELECT * FROM invoice_components WHERE invoice = 18 FOR UPDATE; 
SELECT * FROM invoice_expenses WHERE invoice = 18 FOR UPDATE; 

Todo funciona bien para la primera transacción y las filas están seleccionadas y bloqueadas.

transaction 2

START TRANSACTION; 
SELECT * FROM invoices WHERE invoice_id = 19 FOR UPDATE; 
SELECT * FROM invoice_components WHERE invoice = 19 FOR UPDATE; 
SELECT * FROM invoice_expenses WHERE invoice = 19 FOR UPDATE; 

La segunda transacción devuelveERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction para la tercera consulta.

Lo mismo ocurre cuando intento SELECCIONAR ... PARA ACTUALIZAR otras facturas y sus componentes y gastos. Parece que la primera transacción ha bloqueado todas las filas en la tabla invoice_expenses. ¿Alguna idea de por qué sucede esto?

Información adiciona

Transaction 2 comienza después de la tercera consulta de la transacción 1. No hay otros usuarios, conexiones o transacciones en el servidor.

El problema ocurre en el nivel de aislamiento de transacción REPEATABLE READ predeterminado. Se arregla cambiando al nivel LEER COMPROMETIDO. Esta es una solución, pero aún no explica por qué ocurre el problema con invoice_expenses y no con invoice_components.

Respuestas a la pregunta(3)

Su respuesta a la pregunta