2011-06-14 162 views
0

喂,數據庫JDBC使用多核VS隔離級別的開銷

我想數據與使用JDBC ative WAL多核系統上的數據庫。我正在考慮在我的應用程序中產生多個線程來並行地插入數據。

如果應用程序有多個線程,我將不得不將隔離級別提高到Repeatable Read,這在MVCC數據庫上應該映射到Snapshot isolation

如果我使用的是一個線程,我不需要隔離級別。據我所知,大多數Snapshot isolation數據庫分析可能發生衝突的所有事務的寫集,然後回滾除真實衝突事務之外的所有事務。更具體的我正在談論Oracle,InnoDB和PostgreSQL。

1.)這種寫入集的分析是否昂貴?

2.)多線程插入以獲得更高的總吞吐量是否是一個好主意?真正的衝突幾乎是不可能的,因爲應用程序層提供線程衝突免費的東西。但是數據庫應該是一個安全網。

回答

1

Oracle不支持可重複讀取。它僅支持Read Committed和Serializable。我可能會誤解,但爲Oracle設置可重複讀取的隔離級別可能會導致具有Seri​​alizable隔離級別的事務。簡而言之,您只需要支持您希望的隔離級別的數據庫支持。

我不能說InnoDB和PostgreSQL,但如果它們不支持所需的隔離級別,它們也適用。數據庫可以自動將隔離級別升級到更高級別以滿足所需的隔離特性。如果您的應用程序需要的隔離級別必須是可重複讀取,您應該重新考慮這種方法。

您正確推斷的問題是,如果檢測到衝突,樂觀鎖定可能會導致事務回滾。 Oracle通過報告ORA-08177 SQL錯誤來做到這一點。由於當兩個線程訪問相同的數據範圍時會報告此錯誤,因此如果線程針對涉及不同數據範圍的數據集工作,則可以避免該錯誤。在跨線程分工時,您必須確保這種情況。

+0

Oracle稱爲'Serializable'真的是'快照隔離',還是我誤解了?我不認爲這些數據庫都有真正的「Serializable」。 – 2011-06-14 13:11:12

+0

這是快照隔離,因爲在讀取/更新時將SCN(系統更改號)與事務開始時的SCN進行比較。如果它檢測到更改,則會引發ORA-08177錯誤。 – 2011-06-14 13:16:38

+0

好吧,我的多線程系統我需要Orcales'Serializable'。這仍然比一個線程便宜嗎? – 2011-06-14 13:28:58

1

我認爲這裏的限制因素是磁盤IO,而不是移動到可重複讀取的開銷。

即使是單個線程也可以使數據庫服務器上的磁盤達到最大值,特別是插入/更新時所需的數據庫記錄量。你確定這不是事實嗎?另外,在任何多用戶系統中,無論如何,您可能希望使用可重複讀取隔離(Postgres僅支持此功能和可序列化)來運行。所以,我不認爲這會增加我通常看到的任何「開銷」。

+0

服務器將被縮放以處理WAL,數據可以保留在內存中(希望)。檢查點間隔將設置得非常高,以便WAL可以單獨使用該磁盤。 – 2011-06-14 13:38:38