1

クラスユーザー{

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)

ネストされたトランザクションがロールバックするかどうかを知りたいですか?

4

1 に答える 1

4

あなたはすでにcon.commit();before と after(in myMethod() method) を呼び出しているので、文句Savepoint sp = con.setSavepoint();はありません。savepoint

COMMIT removes all the save points.こちらのドキュメントを参照してください:

  1. Oracle SAVEPOINT文
  2. SQLite セーブポイント

commitセーブポイントを設定したい場合は、通話を外してください。

コードの現在の状態では、成功した場合、すべてのトランザクションがコミットされるため、ロールバックは不可能です。

于 2012-10-31T03:24:13.547 に答える