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