类用户{
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)
我想知道嵌套事务是否会回滚吗?
最佳答案
由于您已经在mycc()中的myMethod()方法之前和之后调用了con.commit();
,因此没有Savepoint sp = con.setSavepoint();
,因此没有任何抱怨。savepoint
请在此处参考文档:
Oracle SAVEPOINT Statement
SQLite Save Point
如果要设置保存点,请删除COMMIT removes all the save points.
呼叫。
在代码的当前状态下,无法进行回滚,因为所有事务(如果成功)都将被提交。