Java 为什么错误代码仍然是con.commit()

Java 为什么错误代码仍然是con.commit(),java,jdbc,Java,Jdbc,我已将数据库中的stdImage设置为NOTNULL,当我不插入图像时,它会抛出一个错误,但仍然会执行con.commit()计算和数据而不是rollback(),保存到没有图像的数据库。有人能解决此代码中的逻辑错误吗。实际上,rollback()不起作用。我会很感激的 public void stdSave(String stdID, String stdName, String fName, String sSec, String contactNo, Date bdate, String

我已将数据库中的
stdImage
设置为NOTNULL,当我不插入图像时,它会抛出一个错误,但仍然会执行con.commit()计算和数据而不是rollback(),保存到没有图像的数据库。有人能解决此代码中的逻辑错误吗。实际上,rollback()不起作用。我会很感激的

public void stdSave(String stdID, String stdName, String fName, String sSec, String contactNo, Date bdate, String address, byte[] image) throws RemoteException, SQLException {

    String stdQuery = "INSERT INTO dbo.StudentTable (stID, stName, stFName, classSection,"
                    + "contact, date, pAddress) VALUES (?, ?, ?, ?, ?, ?, ?)";
            String imgQuery = "INSERT INTO dbo.StdImage (stdID, stdImage) VALUES (?, ?)";
            Savepoint save = null;

            try { 
            try(PreparedStatement stmt = con.prepareStatement(stdQuery); 
                    PreparedStatement stmt1 = con.prepareStatement(imgQuery)) {
                con.setAutoCommit(false);
                save = con.setSavepoint();
                stmt.setString(1, stdID);
                stmt.setString(2, stdName);
                stmt.setString(3, fName);
                stmt.setString(4, sSec);
                stmt.setString(5, contactNo);
                stmt.setDate(6, bdate);
                stmt.setString(7, address);
                stmt.execute();

                stmt1.setString(1, stdID);
                stmt1.setBytes(2, image);
                stmt1.execute();

            }
            }
            catch(Exception e) {
                try {
                    con.rollback(save);
                }
                catch (Exception e1) {
                JOptionPane.showConfirmDialog(null, "Cannot add the student to database " + e);
                }
            }
            con.commit();

        }

您正在调用
con.commit()在try-catch块之后,由于捕获了所有异常,因此始终调用commit

您可能应该在try块内移动
commit

        ...
        con.commit();
    }
    catch(Exception e) {
        try {
            con.rollback(save);
        }
        catch (Exception e1) {
            JOptionPane.showConfirmDialog(null, "Cannot add the student to database " + e);
        }
    }
永远不要在catch块中执行
con.commit()
,这可能会导致意外提交。将
con.commit()
移动到您的try块。 接下来,请查看您正在回滚到一个保存点,但保存点为空。它没有初始化。
con.回滚(保存)已完成,但此处
save=null


要么简单地执行
con.rollback()
要么初始化保存点,然后回滚到它。

我这样做了,但仍然在为空映像引发异常之后,我无法将stdImage添加到数据库中,我不明白为什么。您可以看到我已将autocommit()设置为false,但still@user8297824即使发生异常,也可以调用
con.commit()
。不应该。我已将con.commit()放在try块中,但在我尝试使用null image保存数据,然后尝试使用image保存数据后,它不起作用,在表中,它在第二次尝试时未在中保存图像database@user8297824您的意思是要从只插入StudentTable行而不插入相应StdImage行的情况中恢复吗?假设stID是这些表的主键,则不能在StudentTable中插入已经存在的stID。您必须检查该表中是否已经存在stID(使用SELECT语句),并且只有在不存在的情况下,调用INSERT.yes这就是我在StudentTable中插入数据时所说的,没有stdImage它给我一个空的图像异常,然后我将图像添加到同一个表中。它没有给出任何错误,主键已经使用,但没有将图像添加到stdImage表中,所以如何从stdImage的空异常中恢复并将stdImage插入到stdImage表