有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Oracle如何正确执行事务?

我的发言:

statement.addBatch("START TRANSACTION;" +
                "UPDATE FIRST_TABLE SET FIRST_FIELD = 1;" +
                "UPDATE SECOND_TABLE SET SECOND_FIELD = 2;" +
                "UPDATE THIRD_TABLE SET THIRD_FIELD = 3;" +
                "COMMIT;");

在下一行中抛出异常:

statement.executeBatch();

如果我使用方法execute,也会发生同样的情况:

statement.execute(myTransaction);

例外情况:

java.sql.BatchUpdateException: ORA-00900: invalid SQL statement

我使用甲骨文。如果在命令行或SQLIDE中执行此语句,则没有任何异常。在这种情况下,它工作正常。只有在java代码中才存在此异常。怎么了


共 (4) 个答案

  1. # 1 楼答案

    作为旁注,为了创建一批SQL,您必须将每条语句分别添加到该批中

    因此,不是:

         statement.addBatch("START TRANSACTION;" +
                "UPDATE FIRST_TABLE SET FIRST_FIELD = 1;" +
                "UPDATE SECOND_TABLE SET SECOND_FIELD = 2;" +
                "UPDATE THIRD_TABLE SET THIRD_FIELD = 3;" +
                "COMMIT;");
    

    使用:

         statement.addBatch("START TRANSACTION;");
         statement.addBatch("UPDATE FIRST_TABLE SET FIRST_FIELD = 1;");
         ....
    

    但是,这不是运行事务的标准方式。要运行事务,请执行以下操作:

        con.setAutoCommit(false); //so that a transaction is not committed after each
                                  //statement
    
        //run you queries
        statement.executeUpdate(); //or statement.executeBatch();
        ...
        //in the end commit
        con.commit();
    
  2. # 2 楼答案

    通常,您会使用连接的setAutoCommit()方法启动事务,运行语句,最后适当地调用commit()或rollback()。这是一种与数据库无关的事务处理方式。不确定,为什么要为相同的对象构造SQL!你能详细说明一下你的用例吗

    Connection con = dataSource.getConnection();
    try {
        con.setAutoCommit(false);
        Statement stmt = con.prepareStatement("<your update statement with placeholders for  parameters");
        stmt.set(1, <Value1>);
        stmt.set(2, <Value2>);
        stmt.execute();
        con.commit();
    }
    catch (SQLException sqle) {
        // Handle the exception
        con.rollback();
    }
    finally {
        con.close();
    }
    

    注意:在获取连接和关闭连接时,在上面的代码中有许多角落的情况需要处理,为了使这看起来更简单,请忽略此项

  3. # 3 楼答案

    尝试将每个Update语句添加到一个单独的addBatch()

  4. # 4 楼答案

    试试看

    connection.setAutoCommit(false);
    statement.addBatch("UPDATE FIRST_TABLE SET FIRST_FIELD = 1");
    statement.addBatch("UPDATE SECOND_TABLE SET SECOND_FIELD = 2");
    statement.addBatch("UPDATE THIRD_TABLE SET THIRD_FIELD = 3");
    int [] counts = statement.executeBatch();
    connection.commit();