2012-08-15 33 views
0

我的發言:甲骨文 - 如何正確執行事務?

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 

我使用Oracle。我沒有任何異常,如果我在命令行或SQL IDE中執行此語句。它在這種情況下正常工作。有此異常只在Java代碼。哪裏不對?

回答

3

嘗試,

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

一般情況下,你會使用連接的的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(); 
} 

注:有許多其他的情況在上面的代碼來處理,而獲得連接,並同時關閉它,離開了讓這個看起來很簡單的吧!

1

嘗試添加的每個更新語句的分離addBatch()

0

作爲一個方面說明,以創建一個批處理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(); 
+0

JDBC不鼓勵使用通過驅動程序提供的功能的語句(如事務),請參閱http://docs.oracle.com/javase/7/docs/api/java/ sql/Connection.html的原因是,用一個語句做這件事可能會使驅動程序處於不一致的狀態 – 2012-08-16 18:35:03