【问题标题】:"java.sql.SQLException: SAVEPOINT _667166fe_13ab4b3e3de__8000 does not exist" exception occur in nested transaction rollback ?“java.sql.SQLException:SAVEPOINT _667166fe_13ab4b3e3de__8000 不存在”嵌套事务回滚中发生异常?
【发布时间】:2012-10-31 02:54:47
【问题描述】:

类用户{

public static void main(String arg[]) throws SQLException {
    Connection con = DBConnect.getConnection();
    con.setAutoCommit(false);
    PreparedStatement pstmt;
    System.out.println(con.getMetaData().supportsSavepoints()); // true
    try {
        pstmt = con.prepareStatement("insert into emp(emp_id, emp_name, salary, address, contact_number)values(?,?,?,?,?)");
        pstmt.setInt(1, 1);
        pstmt.setString(2, "a");
        pstmt.setDouble(3, 8);
        pstmt.setString(4, "s");
        pstmt.setInt(5, 9);
        pstmt.executeUpdate();
        con.commit();
        Savepoint sp = con.setSavepoint();
        if (myMethod(con)) {
            /**
             * I want to rollback the nested transaction if any error occur
             */
            con.rollback(sp);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public static boolean myMethod(Connection con) throws SQLException {

    PreparedStatement pstmt;
    try {
        pstmt = con.prepareStatement("insert into emp(emp_id, emp_name, salary, address, contact_number)values(?,?,?,?,?)");
        pstmt.setInt(1, 2);
        pstmt.setString(2, "G");
        pstmt.setDouble(3, 8);
        pstmt.setString(4, "G");
        pstmt.setInt(5, 10);
        pstmt.executeUpdate();
        con.commit();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return true;
}

}

在上面的代码中,如果任何条件失败,我想回滚嵌套事务。我在提交第一个事务后创建了一个保存点。我遇到了一个异常

java.sql.SQLException: SAVEPOINT _667166fe_13ab4b3e3de__8000 does not exist
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2988)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:935)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:873)
at com.mysql.jdbc.Connection.rollback(Connection.java:4777)
at com.User.main(User.java:31)

我想知道嵌套事务是否会回滚?

【问题讨论】:

    标签: java mysql exception jdbc


    【解决方案1】:

    由于您已经在(在 myMethod() 方法中)Savepoint sp = con.setSavepoint(); 之前和之后调用了 con.commit();,因此没有 savepoint 并因此抱怨。

    COMMIT removes all the save points.请参考这里的文档:

    1. Oracle SAVEPOINT Statement
    2. SQLite Save Point

    如果您想设置保存点,请移除commit 调用。

    在代码的当前状态下,如果成功,所有事务都已提交,因此无法回滚。

    【讨论】:

    • 如果我不提交事务,则不需要创建保存点。在这种情况下,如果条件失败,我将不提交事务。
    • @gauravkumar:保存点是您想要在异常情况下使用的逻辑点,例如,您有 step1 和 step2 在同一事务中按顺序执行。现在,如果您不使用保存点,您将回滚 step1 和 step2 以防出现异常。现在,如果您在 step1 之后创建了一个保存点,并且在 step2 中发生了异常,您可以回滚到该保存点,在这种情况下 step1 没有回滚并且您可能只能提交 step1。在你的情况下,你已经提交了,那么你将如何回滚?如果没有回滚,保存点将如何提供帮助?
    • @gauravkumar:总之,COMMIT removes all previous savepoints。在此处阅读文档-SAVEPOINT-COMMIT
    • 谢谢......我无法理解保存点的概念。现在我明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多