2012-11-30 26 views
1

我們的應用程序是高度併發的。它正在取出MQ數據並將其保存到數據庫中。有多個消息可能包含相同的數據。所以一條消息可能包含運行時間,第二條消息可能包含運行時間和位置。插入失敗後可以繼續進行數據庫事務嗎?

因此,第一條消息通過,我保存了營業時間數據。然後,第二筆交易的營業時間與實際數據相同。現在我需要保存位置數據,但運行時間是重複的。由於併發性,我無法檢查數據庫的運行時間(如果檢查,它可能不存在,那麼在我保存它時,它可能已被另一個線程插入)。我也想快點。 (這個裝載器有很多負載)。

當前消息獲取一個Transaction(Propagation.REQUIRED)(使用Spring和Hibernate)。我在每種數據插入後都做一次沖洗。所以我保存位置數據,並做一個刷新。那麼我可以節省運行時間並沖洗。

如果我只是發現了錯誤信息(它在flush())後被拋出並且吃掉了,其他的數據(位置數據)還會被保存嗎?數據庫插入失敗後,事務仍然可以使用嗎?所以如果第一次保存失敗,我想第二次插入工作。

我一直在尋找Propagation.REQUIRES_NEW,但遇到了一些麻煩。另外,我擔心會減慢速度。我需要3個交易(在這之前有一些邏輯)。

大部分關於回滾的信息,但我不想回滾。我只想繼續前進。我可以嗎?

+0

Oracle數據庫... – markthegrea

+0

這聽起來像是一個良好的老式JDBC的工作,如果你真的需要用Hibernate做,無狀態會話呢? – Affe

回答

2

不,你不能捕捉異常並嘗試繼續。這裏的chapter about exception handling of the hibernate documentation說什麼:

如果Session拋出異常,包括任何的SQLException, 立即回滾數據庫事務,調用Session.close() ,丟棄該Session實例。會話的某些方法不會 使會話保持一致狀態。 沒有拋出異常Hibernate可以被視爲可恢復。