2012-10-12 70 views
3

如果在長時間運行期間連接丟失會發生什麼情況?oracle斷開連接行爲

例如,有一個select語句需要幾分鐘才能完成,並且在執行過程中連接丟失。它會繼續執行還是會被停止?

對於刪除語句:當客戶端斷開連接時,它會被執行到結束還是被中斷?數據會發生什麼:它會被承諾或回滾,多久?

對於ddl操作:我有一個長時間的運行alter table tbl_name move操作,當客戶端丟失連接時會發生什麼?會繼續執行還是會中斷?

+1

閱讀['ACID'](http://en.wikipedia.org/wiki/ACID)屬性。它說「全部或全部」。 – Annjawn

回答

4

我假設我們正在討論類似於客戶端應用程序崩潰的問題或者網絡連接被丟棄,而不是應用程序正在執行乾淨斷開連接的情況,因爲當事務處於打開狀態時無法執行乾淨的斷開連接,更不用說語句正在運行。

通常,語句將在服務器上運行完成(其中SELECT的「完成」是它可以返回客戶端請求的第一組行的點,這可能需要或可能不需要執行語句其整體)。然後服務器會嘗試將結果準備好回傳給客戶端。當它沒有得到響應(可能需要幾分鐘時間才能等待ACK數據包),它知道客戶端進程已經死了,並開始回滾未提交的事務(釋放所有的鎖由交易持有)。如果您作爲交易的一部分對數據庫進行了更改(即您已經完成了插入,更新和/或刪除操作),則可能需要一段時間才能回滾更改,以便首先生成更改。

0

所有的數據庫操作都根據ACID屬性工作。

Atomicity 

對數據的所有更改都像是單個操作一樣執行。也就是說,所有的改變都被執行,或者它們都不是。
這意味着根據原子性,變化被回滾。

+0

更棘手的部分是「何時」。看起來Oracle並沒有完全快速地認識到連接關閉。 – Luaan

1

對於簡單的DML語句,例如您的selectdelete,事務將被回滾或提交。

「什麼時候會發生?這實際上並不重要。其他客戶端只能看到已提交事務的結果,因此時間無關緊要。

對於DDL語句,根據the official docs,「在數據庫執行DDL語句之前立即發生隱式COMMIT,緊接着發生COMMIT或ROLLBACK」。

在事務中,如果要執行一些DML語句,然後執行DDL語句,則可以提交DML語句,但DDL語句會回滾 - 即使它們都處於同一事務中。

對於你給出的簡單例子,它是全部或全部。 ......一般來說,如果您在收到已確認的交易確認之前失去了聯繫 - 您只是不會考慮是否有效。你必須驗證。

[編輯:剛上稍微複雜的「需要驗證」 ...你要驗證是否已將數據庫中的「提交」(顯式或隱式),而你失去了你連接,然後再知道數據庫是否執行了提交。
如果在發佈提交之前失去連接,可以保證它會回滾(上面的DDL警告)]

+1

當長時間運行的INSERT,UPDATE或DELETE語句會獲取需要通過回滾事務來釋放的鎖時,「when」可能很重要。由於您正在討論的多版本讀取一致性,查詢無關緊要。但是,如果有人需要在另一個會話中重新啓動長時間運行的操作,這將會很重要。 –