当前位置: 首页 > 知识库问答 >
问题:

表单提交时MySQL锁定等待超时

李景天
2023-03-14

这是我的servlet的doPost方法,理论上它在db中添加数据

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    Date d=(Date) request.getAttribute("data");
    DatiAnagrificiImpl dai=new DatiAnagrificiImpl();
    dai.addDatiAnagrafici(new DatiAnagraficiBean(request.getParameter("username"),request.getParameter("cap"),request.getParameter("nome")
                                            ,request.getParameter("cognome"),request.getParameter("telefono"),d));
}

这里是在db中插入数据的方法

enter public void addDatiAnagrafici(DatiAnagraficiBean dab) {
    // TODO Auto-generated method stub
    try {
        Statement s=c.createStatement();
        s.executeUpdate("insert into Dati_anagrafici values('"+dab.getIdUtente()+"','"+dab.getIdCittà()+"',"
                        + "'"+dab.getNome()+"','"+dab.getCognome()+"','"+dab.getTelefono()+"','"+dab.getDataNascita()+"')");
    }catch(SQLException e) {
        
    }finally {
        al.add(dab);
    }
}

但是,当我尝试使用servlet执行此操作时,出现了以下错误

错误1205(HY000):超出锁定等待超时;

有人知道如何解决?如果我对一个普通的java类做同样的事情,那么一切都很好。

共有1个答案

淳于星宇
2023-03-14

您似乎有一个未完成的事务。在MySQL中,尝试运行以下命令以查看正在发生的情况:

SHOW ENGINE INNODB STATUS;
SHOW FULL PROCESSLIST;

其中一个或两个应该提供一些线索。

代码中有几个突出的问题。我要解决的第一件事是,语句从未关闭(但应该关闭)。您可以在几个地方关闭语句,但作为最简单的示例,您可以在调用executeUpdate()之后立即关闭语句,如下所示:

Statement s = c.createStatement();
s.executeUpdate("...");
s.close();

另一个简单的改变:捕获异常时,对其进行处理(而不是默默地“吞咽”异常)。可能会引发异常,但上面的代码将隐藏该异常。例如,与此相反:

catch (SQLException e) {

}

试试这个:

catch (SQLException e) {
    e.printStackTrace();
}

最后一个改进是稍微修改一下代码以使用“try-with-资源”——这是自动关闭资源的一个很好的便利(在这种情况下,是您的语句)。这可能看起来像这样:

Connection connection = getConnection();
try (Statement statement = connection.createStatement()) {
    statement.executeUpdate("...");
} catch (SQLException e) {
    e.printStackTrace();
}
 类似资料:
  • 问题内容: 我正在使用Hibernate,试图模拟2个并发更新到数据库中的同一行。 编辑:我将em1.getTransaction()。commit移到em1.flush()之后;我没有收到任何StaleObjectException,两个事务已成功提交。 我在上遇到以下异常。为什么? 问题答案: 好吧,您正试图陷入僵局,并且成功了:-) Transaction1开始,与您的实体更新(和锁定)行。

  • 问题内容: 最近几天,随机地,我的网站变得非常缓慢。我开始尽力调查。我看到MySQL进程正在使用服务器可用内存的85%-95%(我也应该升级我的内存吗?)。 我检查了我的MySQL进程日志,发现有很多查询,其中包括: 等待表级锁定 但是我还注意到,所有这些带有“表级锁定”的查询都是与表有关的查询。 我还有20个其他表,它们具有不变的查询,但是我在列表中没有看到它们。.所以我猜问题出在users表上

  • 问题内容: 更新记录时,我反复出现锁定超时超出异常的情况。 我正在使用Java Struts 2.1 Hibernate配置。使用的数据库是MYSQL。 任何人都知道如何解决它。 问题答案: 这里有一些建议: “ 锁定等待超时 ”通常发生在事务正在等待要更新的数据行上,而该行已被某些其他事务锁定时。 在大多数情况下,问题出在数据库方面。可能的原因可能是表格设计不当,数据量大,约束等。 请查看这个详

  • 问题内容: 从脚本中,我将这样的查询发送了数千次到本地数据库: 我忘了添加where部分,因此同一列为表中的所有行设置了相同的值,并且完成了数千次,并且对该列建立了索引,因此相应的索引可能更新了太多次。 我注意到出了点问题,因为花了太长时间,所以我杀死了脚本。从那以后,我什至重新启动了计算机,但表中有些东西卡住了,因为简单的查询需要很长时间才能运行,并且当我尝试删除相关索引时,它失败并显示以下消息

  • 在Bash脚本中,我想做如下操作: 一、 例如,在后台启动两个应用程序,并给他们60秒时间完成工作。然后,如果他们没有在这段时间内完成,就杀了他们。 不幸的是,上面的方法行不通,因为< code>timeout是一个可执行文件,而< code>wait是一个shell命令。我试着把它改成: 但是这仍然不起作用,因为< code>wait只能在同一个shell中启动的PID上调用。 有什么想法吗?

  • 问题内容: 我正在运行以下MySQL 语句: 我没有使用交易,所以为什么会出现此错误?我什至尝试重新启动MySQL服务器,但没有帮助。 该表有406,733行。 问题答案: 您正在使用交易;autocommit不会禁用事务,它只是使它们在语句末尾自动提交。 发生的情况是,某个其他线程在某个记录上保持记录锁定(您正在更新表中的每个记录!)的时间太长,导致您的线程超时。 您可以通过以下方式查看事件的更