2015-06-02 88 views
1

我連接到Oracle Java程序,並執行以下操作發生在我的JDBC事務是什麼:如果我失去了我的會議

  • 啓動會議

  • 開始交易

  • 插入一堆行,調用存儲過程等。

  • 提交事務

  • 結束會話

左右。 。 。如果在交易過程中我失去了會話(由於網絡問題或某種程度的原因)會發生什麼?我是否會自動回滾?交易超時後我會回滾嗎?我擔心我的數據庫將處於不一致的狀態,直到甲骨文開始清理。

+0

我很擔心行被鎖定的交易,並沒有被釋放,直到甲骨文注意到我的會議不見了,繼續前進併爲我回滾。注意我很不確定,這就是爲什麼我問。 。 。 – akaioi

+0

http://stackoverflow.com/questions/5932437/oracle-user-disconnected-without-committing-rolling-back-not-longer-can-change – OldProgrammer

+0

相關:[Oracle用戶斷開連接而不提交/回滾,不再可以更改數據庫](http://stackoverflow.com/questions/5932437/oracle-user-disconnected-without-committing-rolling-back-not-longer-can-change)和[關閉連接上的JDBC事務回滾失敗](http ://stackoverflow.com/questions/27449974/jdbc-transaction-rollback-failure-on-closed-connection)。 – sleske

回答

1

如果在執行事務期間會話丟失,Oracle數據庫將自動回滾您的更改。您可以在文檔中閱讀有關Statement level atomicity的更多信息。如果由於網絡問題而導致事務丟失,則通常會得到ORA-03113: end-of-file on communication channel,並且事務已在數據庫上回滾。

但是,只有當數據庫服務器上的會話丟失時纔會出現這種情況。特別是對於分佈式事務(XA),當JDBC會話結束時,數據庫事務通常保持活動狀態,因此當您有XA事務時,請注意這一點。

還要注意在JDBC驅動程序中默認打開的自動提交。這會自動提交您執行的每個操作,因此如果您的事務處理時間較長(說10個插入並且您的第9個插入失敗),插入1 - 8將自動提交併且不會再回滾。自動提交可以通過Connection.setAutoCommit(false);被關閉,見setAutoCommit in the JDBC API documentation

+1

關於自動提交的好處。請注意,如果您使用實現JPA(Java持久性API)的ORM(例如Hibernate或EclipseLink),則自動提交將自動關閉,並覆蓋由JDBC設置的默認值。 – sleske

0

如果我失去了我的會話(由於網絡問題或 有點)在交易的中間發生了什麼?

究竟發生了什麼取決於您使用的數據庫系統(DBMS)及其配置。但大多數DBMS,特別是Oracle,都配置了超時(或多個超時)。如果超時過期,事務將被回滾。

尤其是Oracle,DBA可以列出Oracle服務器上的打開會話,甚至可以在超時過期之前強制終止會話。結果將是相同的:被終止的會話內的任何掛起的事務將被回滾。

我擔心我的數據庫將處於不一致的狀態,直到甲骨文得到清理。

這取決於您所指的「不一致狀態」以及您所使用的事務隔離級別。只要事務仍然是開放的,可能有一定的副作用,如:

  • 其他看到看到部分地改變的數據(依賴於隔離級別)
  • 行/表被鎖定

事務一旦回滾,就好像它從未發生過一樣。畢竟,這是使用交易的目的:-)。 如果您擔心您的交易可能會滯留太久,您可能需要調整相關超時。

1

除了所有相關的其他回覆之外,我想補充一點,如果在提交過程中您失去與數據庫的連接,您將收到一個異常,它不會告訴您提交是否成功或不。要知道交易是否已經履行,您可以依靠Transaction Guard,這是12c中的一項新功能。

沒有解釋它是如何工作的一個博客: https://blogs.oracle.com/dev2dev/entry/write_recovery_code_with_transaction

您也可以參考數據庫開發指南,其中有一個描述交易員的部分。