我有一個非常長的事務,我試圖使用JDBC執行PostgreSQL。在JDBC我不能使用COMMIT
和ROLLBACK
,所以我想實現在Java代碼中我所期望的行爲......PostgreSQL事務失敗:「沒有正在進行的事務」
try {
con = DriverManager.getConnection(url, user, password);
con.setAutoCommit(false);
Statement st = con.createStatement();
st.execute(myHugeTransaction);
con.commit();
} catch (SQLException ex) {
try {
con.rollback();
} catch (SQLException ex1) {
// log...
}
// log...
}
對於小的語句,這工作得很好,但對於路數有關在一個事務10K報表,失敗與
org.postgresql.util.PSQLException: ERROR: kind mismatch among backends. Possible last query was: "COMMIT" kind details are: 0[C] 1[N: there is no transaction in progress]
的con.commit
線有趣的是,如果我趕上SQL警告與st.getWarnings();
我可以看到數據庫的實際處理我發送整個腳本,就在提交時,這一切都失敗了。
順便說一句,交易是完全正常的。我將它的一個精確副本寫入一個文件,並且可以通過將其複製到pgAdmin中而無誤地運行它。希望你能幫助我在那一個,我一直在尋找,現在幾個小時測試的東西...
編輯
也許是我沒有得到這個權利,所以兩個問題:
- 我可以在
Statement.execute()
的一個調用中執行多個語句嗎? - 如果不是,使用JDBC使用多個語句來運行腳本的正確方法是什麼(無需解析並將其拆分爲單個語句)?
你沒有做任何在你的腳本中進行提交(直接或間接)? – 2013-03-07 16:20:25
此錯誤來自pgpool。您可能會拋出一個不受pgpool配置支持的多語句查詢。 – 2013-03-07 17:09:39
如果您在'Statement.execute()'調用中執行多個語句,那麼您沒有按照預期使用JDBC API。 – 2013-03-07 19:39:39