nstrução @InnoDB SELECT… FOR UPDATE bloqueando todas as linhas em uma tabela

MySQL Server versão 5.1.41 com o plugin InnoDB ativado. Eu tenho as três tabelas a seguir para faturas: faturas, invoice_components e invoice_expenses. As faturas da tabela possuem a chave primária invoice_id. Tanto invoice_components quanto invoice_expenses estão vinculados a faturas de tabela com invoice_id como uma chave estrangeira não exclusiva (cada fatura pode ter mais de um componente e mais de uma despesa). Ambas as tabelas têm um índice BTREE para essa chave estrangeir

Tenho as seguintes transações:

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; 

Tudo funciona bem para a primeira transação e as linhas são selecionadas e bloqueada

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; 

A segunda transação retornaERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction para a terceira consulta.

O mesmo acontece quando tento SELECIONAR ... PARA ATUALIZAR outras faturas e seus componentes e despesas. Parece que a primeira transação bloqueou todas as linhas na tabela invoice_expenses. Alguma idéia de por que isso está acontecendo?

Informação adiciona

Transaction 2 inicia após a terceira consulta da transação 1. Não há outros usuários, conexões ou transações no servido

O problema ocorre no nível de isolamento da transação REPEATABLE READ padrão. É corrigido alterando para o nível READ COMMITTED. Essa é uma solução, mas ainda não explica por que o problema está ocorrendo com invoice_expenses e não com invoice_component

questionAnswers(3)

yourAnswerToTheQuestion