Como sua pergunta é feita aqui no ServerFault, é lógico supor que você está procurando uma solução MySQL para um problema do MySQL, particularmente no domínio do conhecimento do qual um administrador de sistema e / ou um DBA teria conhecimento. , a seção a seguir aborda suas dúvidas:
If the first transaction is never committed or rolled back, then the second transaction will be blocked indefinitely
Não, não vai. Acho que você não está entendendo innodb_lock_wait_timeout
. Faz exatamente o que você precisa.
Ele retornará com um erro, conforme indicado no manual:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
- Por definição, isso não é indefinido . Se seu aplicativo reconectar e bloquear repetidamente, seu aplicativo está "bloqueando indefinidamente", não a transação. A segunda transação bloqueia definitivamente por
innodb_lock_wait_timeout
segundos.
Por padrão, a transação não será revertida. É responsabilidade do código do seu aplicativo decidir como lidar com esse erro, seja tentar novamente ou retroceder.
Se você quiser a reversão automática, isso também é explicado no manual:
The current transaction is not rolled back. (To have the entire transaction roll back, start the server with the --innodb_rollback_on_timeout
option.
RE: Suas numerosas atualizações e comentários
Primeiro, você declarou em seus comentários que "quis dizer" que deseja uma maneira de expirar a transação primeira que está bloqueando indefinidamente. Isso não é aparente na sua pergunta original e entra em conflito com "Se a primeira transação nunca for confirmada ou revertida, a segunda transação será bloqueada indefinidamente".
No entanto, eu posso responder a essa pergunta também. O protocolo MySQL não possui um "tempo limite de consulta". Isso significa que você não pode expirar a primeira transação bloqueada. Você deve esperar até que seja finalizado ou matar a sessão. Quando a sessão é eliminada, o servidor automaticamente reverta a transação.
A única outra alternativa seria usar ou escrever uma biblioteca mysql que utilize E / S sem bloqueio que permitiria que o aplicativo mate o thread / fork fazendo a consulta após N segundos. A implementação e o uso de tal biblioteca estão além do escopo do ServerFault. Esta é uma pergunta apropriada para o StackOverflow .
Em segundo lugar, você declarou o seguinte em seus comentários:
I was actually more concerned in my question with a scenario in which the client app hangs (say, gets caught in an infinite loop) during the course of a transaction than with one in which the transaction takes a long time on MySQL's end.
Isso não era aparente em sua pergunta original, e ainda não é. Isso só poderia ser discernido depois que você compartilhasse esse detalhe importante no comentário.
Se este é realmente o problema que você está tentando resolver, então eu tenho medo que você tenha perguntado no fórum errado. Você descreveu um problema de programação em nível de aplicativo que requer uma solução de programação, que o MySQL não pode fornecer, e está fora do escopo desta comunidade. Sua resposta mais recente responde à pergunta "Como evito que um programa Ruby seja infinitamente"? Essa pergunta é fora do tópico para essa comunidade e deve ser feita em StackOverflow .