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
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:
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.
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!