【问题标题】:Oracle - How to execute transaction correctly?Oracle - 如何正确执行事务?
【发布时间】:2012-08-15 08:39:21
【问题描述】:

我的声明:

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

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

【问题讨论】:

    标签: java sql oracle jdbc transactions


    【解决方案1】:

    试试,

    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();
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        通常,您会使用连接的 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();
        }
        

        注意:在上面的代码中,在获取连接和关闭连接时有很多特殊情况需要处理,为了让这看起来简单,暂时省略了!

        【讨论】:

          【解决方案4】:

          附带说明,为了创建一批 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();
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-26
          • 1970-01-01
          • 2011-11-05
          • 1970-01-01
          • 2019-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多