2013-08-22 37 views
1

我開發一個項目,該項目執行以下操作:PL/SQL和JDBC提交:即使我在jdbc中執行conn.rollback,PL/SQL中的寫入提交是否會提交到數據庫?

  1. 截斷臨時表T1。
  2. 將1000行插入臨時表T1中。
  3. 執行一個包含一些提交語句的過程。
  4. 從表T1插入行到其他相同的表(關於結構)T2。
  5. 用commit語句在其中執行2個更多的過程。

5步以上形成一個交易給我。所以要麼全部完成,要麼全部都不應該完成。

現在,即使我做了conn.rollback,如果發生一些錯誤,很少有更改反映到數據庫中。

是程序中聲明的原因嗎?截斷表是否隱含地提交到數據庫?

如果是?有什麼可能的解決方案?

在此先感謝!

P.N. :數據庫在oracle中,我對PL/SQL的瞭解不多

+0

如果您從另一個客戶端調用過程,調用客戶端應該提交或回滾而不是在存儲過程中,因此您將完全控制您的事務。 – user75ponic

+0

所以我將不得不從我的程序中刪除提交語句。我會這麼做 –

+1

截斷語句怎麼樣?這些是DDL。我認爲他們會承諾,即使我不承諾。糾正我,如果我錯了! –

回答

3

截斷表(或者執行任何其他DDL語句)會導致執行語句前後的隱式提交。在您的程序中提交也將終止您的交易。

如果您確實希望所有這些步驟成爲單個事務的一部分,您需要刪除TRUNCATE(您確定您確實需要這樣的全局臨時表嗎?),並從您的過程中刪除commit語句。一般來說,存儲過程不應該包​​含事務控制語句正是由於這個原因 - 如果您希望您的事務包含多個不同的調用,那麼它很難重用它們。

+0

如果只有我的後端開發人員知道這個:/。我花了兩天才說服他們。我正在向他們解釋同樣的事情。發佈這個問題只是爲了確認我是否正確。因爲我對PL/SQL知之甚少。只是我需要的那種答案:) –

+0

SELECT'TRUNCATE TABLE BD_BIDS_APPR_DET'INTO V_SQL1 FROM DUAL; EXECUTE IMMEDIATE V_SQL1; 。執行立即執行隱式提交? –

+1

@AbhishekSingh - 'EXECUTE IMMEDIATE'不會執行隱式提交。執行DDL(需要在存儲過程中使用動態SQL)。 –

相關問題