Erro com transação e MySQL

O meu programa está dando esse erro e eu não faço nem idéia como se resolve isso.
Ele acontece quando eu tento criar uma conecção e abrir uma transação.

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

como assim?? especifique melhor seu erro!!!

A única coisa que sei é que vc deve usar tabelas do tipo InnoDB, e não MyISAM, que é o tipo default do mysql…

o tipo MyISAM não tem suporte a transações!

Eu nunca vi esse erro na minha vida e por isso nem sei como dar mais explicações. Acontece que eu usei esse código para abrir outras transações em outras partes do meu programa e funcionou certinho e só nessa em uma parte do código dá erro.

private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:        
        try{
            Class.forName("org.gjt.mm.mysql.Driver");
            con=DriverManager.getConnection(db.url,db.user,db.pw);
            smt=con.createStatement();
            smt.executeUpdate("start transaction");
        }catch(Exception e){
            System.out.println(e);
            JOptionPane.showMessageDialog(null,"Erro geral ","Erro1",JOptionPane.ERROR_MESSAGE);        
    }

Cara seguinte, para entendermos melhor qualquer tipo de erro. O ideal
é usar no lugar de System.out.println(e);
utilize o seguinte:
e.printStackTrace();
Ai o teu programa vai printar toda a pilha de erros, mostra a classe a linha
a causa do erro e coisa e tal.

[quote=ax]Eu nunca vi esse erro na minha vida e por isso nem sei como dar mais explicações. Acontece que eu usei esse código para abrir outras transações em outras partes do meu programa e funcionou certinho e só nessa em uma parte do código dá erro.

private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try{ Class.forName("org.gjt.mm.mysql.Driver"); con=DriverManager.getConnection(db.url,db.user,db.pw); smt=con.createStatement(); smt.executeUpdate("start transaction"); }catch(Exception e){ System.out.println(e); JOptionPane.showMessageDialog(null,"Erro geral ","Erro1",JOptionPane.ERROR_MESSAGE); } [/quote]

Ué, para iniciar uma transação com o MSQL tem que usar a linha abaixo??

smt.executeUpdate(“start transaction”);

Não basta apenas setar o autocommit do connection para false??

Abraços!
Thiago

Olha eu fiz o que vc pediu

Mas eu consegui resolver isso, mas eu fiquei curioso para saber mais sobre o porquê desse erro. Eu acho que ele tv acontecendo pq a cada click no combo eu abria um nova transação sem fechar a conecção anterior que foi aberta, mas o porquê disso dá erro eu nem faço idéia.
Tá ae a alteração do código:

To revivendo este tópico só pra explicar o motivo.

O MySQL utiliza o método de timeout para tratar deadlocks (a maioria dos SGBDs fazem isso, se nao todos). Se vc iniciou uma transação e iniciou alguma operação, enquanto esta operação nao for finalizada, o registro/tabela/banco vai ficar trabado com um lock feito pelo MySQL. Se iniciar outra transação, esta transação irá aguardar até que o registro/tabela/banco seja liberado, se exceder o timeout o MySQL retorna esse erro aí.

Aí ficam algumas dúvidas:

  • Qual o tempo de timeout?

Esta pergunta pode ser respondida executando o comando “show variables” no console do MySQL. Este comando irá retornar uma lista de variáveis utilizadas pelo SGBD e seus valores. Procure pela variável table_lock_wait_timeout. O valor está em segundos e por default é setado como 50.

OBS: PENSE MUITO ANTES DE ALTERAR ESTE VALOR. Lembre-se que não se trata somente da transação que está em execução, mais também das que irão esperar por esta transação. Em alguns casos existe o risco de sobrecarregar o servidor porque uma transação ira segurar milhares de transações por muito tempo.

  • Por que eu falei registro/tabela/banco?

O lock depende da granularidade utilizada pela transação. O MySQL utiliza o minimo de granularidade por default (registro), mas quando a transação acessa muitos registros, o MySQL altera a granularidade para tabela porque o processo de lock é muito “custoso” e ficar fazendo lock e unlock em cada registro é complicado. Esta granularidade pode se extender até o banco inteiro se o MySQL entender que a transação está acessando muitos registros de tabelas diferentes.

Valeu marvsc, foi muito útil a sua explicação.

Att.

marvsc, muito útil mesmo cara! Muito obrigado!