首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表单提交的MySQL锁等待超时

表单提交的MySQL锁等待超时
EN

Stack Overflow用户
提问于 2022-05-28 14:54:55
回答 1查看 30关注 0票数 1

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

代码语言:javascript
复制
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中插入数据的方法

代码语言:javascript
复制
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类做同样的事情,那就没问题了。

EN

回答 1

Stack Overflow用户

发布于 2022-05-28 16:18:10

看来您有一项尚未完成的事务。在MySQL中,尝试运行这些代码来查看正在发生的事情:

代码语言:javascript
复制
SHOW ENGINE INNODB STATUS;
SHOW FULL PROCESSLIST;

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

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

代码语言:javascript
复制
Statement s = c.createStatement();
s.executeUpdate("...");
s.close();

另一个简单的改变是:当捕获异常时,用它做一些事情(而不是“默默地”吞咽异常)。可能会抛出异常,但上面的代码将隐藏该异常。例如,而不是这样:

代码语言:javascript
复制
catch (SQLException e) {

}

试试这个:

代码语言:javascript
复制
catch (SQLException e) {
    e.printStackTrace();
}

最后一个改进是对代码稍加修改以使用“试着用资源” --为您自动关闭资源(在本例中是Statement)提供了很好的方便。可能是这样的:

代码语言:javascript
复制
Connection connection = getConnection();
try (Statement statement = connection.createStatement()) {
    statement.executeUpdate("...");
} catch (SQLException e) {
    e.printStackTrace();
}

编辑:还有一件事。connection可以(而且应该)通过调用commit() (如果出问题时调用rollback() )来提交。下面是最后一个要尝试的编辑,它显示主try块中的try,而在catch块中有一个rollback(),用于在抛出异常时撤消事务:

代码语言:javascript
复制
Connection connection = getConnection();
try (Statement statement = connection.createStatement()) {
    statement.executeUpdate("...");
    connection.commit();
} catch (SQLException e) {
    e.printStackTrace();
    try {
        connection.rollback();
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72416672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档