执行更新被阻止

executeUpdate blocked

当代码到达步骤 "pstmt.executeUpdate()" 时,它冻结并阻塞,我没有收到任何 SQL 异常

这是有效的:

SQL = "INSERT INTO Procedure (file_path,id) VALUES ('/test/file_test.pdf',512);";
pstmt = con.prepareStatement(SQL,Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();

这不行!我没有收到任何异常,它被阻止了:

SQL = "INSERT INTO Procedure (file_path,id) VALUES (?,?);";
pstmt = con.prepareStatement(SQL,Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, "/test/file_test.pdf");
pstmt.setInt(2, 512);
pstmt.executeUpdate();

我不明白为什么我的代码在使用下一个解决方案时被阻止(我的意思是 setStringsetInt)。

procedure 是 SQL 中的保留关键字。可能是由于这个原因造成的。 将过程 table 名称更改为其他名称并尝试。

您也可以尝试将 Procedure 更改为 `Procedure`。

希望这对你有用。

使用 Try/Catch 和调试器将为您提供有关该问题的更多信息。我过去遇到过类似的问题,这就是我解决它的方法。我不确定问题出在哪里,但试试这个

public void getCar(String carName) {
String[] key = {"PRIMARY_KEY_COLUMN"};
try(Connection con = super.getConnection()) {
    String queryOne = "INSERT INTO Procedure (file_path,id) VALUES (?,?)";;
    try(PreparedStatement pstmt = con.prepareStatement(queryOne, key)){
        pstmt.setString(1, "/test/file_test.pdf");
        pstmt.setInt(2, 512);
        pstmt.executeUpdate();
        int generatedKey = getGeneratedKey(pstmt));
        pstmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
        // Do somthing if connection is set but exception thrown
    }
} catch (SQLException e) {
    e.printStackTrace();
    // Do somthing else if connection couldn't be set
}
}

private int getGeneratedKey(PreparedStatement pstmt) throws SQLException {
    int generatedKey = 0;
    ResultSet rs = pstmt.getGeneratedKeys();
    if (rs.next()) {
        generatedKey = rs.getInt(1);
    }
    rs.close();
    return generatedKey;
}

大家好,错误已找到并已修复

Bug 的原因:例如,假设我们有 2 table B[Id, othercolumn] 和 A[Id, pathfile,fk_id_B] 我在 table B 上开始了一个开始交易(更新记录 id=512) 但是我忘记关闭事务 (connection.commit();connection.close()) 之前我盯着其他人在 A 上开始事务所以导致此冻结,因为预览仍然使用记录 (id=512)交易 解决方案:在 A 上开始交易之前,我在 B

上关闭交易

感谢大家的帮助和参与:)