在一个事务中,插入一个子节点,并更新父节点。在更新父节点时出错错误提示:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.代码:
public static void saveChild(Category c) {
Connection conn = null;
String sql = "insert into category(pid,name,descr,leaf,grade) values (?,?,?,?,?)";
PreparedStatement pstmt = null;
try {
conn = DB.getConnection();
conn.setAutoCommit(false);
// 插入一个子节点
pstmt = DB.getPstmt(conn, sql);
pstmt.setInt(1, c.getPid());
pstmt.setString(2, c.getName());
pstmt.setString(3, c.getDescr());
pstmt.setInt(4, c.isLeaf() == true ? 1 : 0);
pstmt.setInt(5,c.getGrade());
pstmt.executeUpdate();
System.out.println("PID="+c.getPid());
// 更新父节点 
DB.executeUpdate(conn, "update category set leaf = 0 where id= "+c.getPid());
System.out.println("err2");
conn.commit();
conn.setAutoCommit(true);
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
DB.closePstmt(pstmt);
DB.closeConn(conn);
}
}更新父节点的执行方法:
public static void executeUpdate(Connection conn,String sql) {
try {
                        //错误定位在这个语句上
conn.createStatement().executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();

}结果:
事务没有回滚,子节点被插入,父节点没有更新,错误发生在下面这个语句上:
conn.createStatement().executeUpdate(sql);