2016-05-23 73 views
1

我有一個Java方法,它由spring Transactional註釋包裝。Spring交易註釋,隔離不適用於READ_UNCOMMITTED

我在裏面有2個操作,一個是delete,另一個是insert。我的插入語句必須依賴於第一個操作(這是delete),但現在由於第一個操作尚未提交,我的插入失敗(唯一約束)。但有趣的是,通常在同一個事務中,我應該能夠在同一個事務中讀取/看到未完成的操作(我的舊專有框架能夠做到這一點),但這不會發生在我的場景中,第二個插入仍然失敗,因爲它看到數據尚未刪除。

我嘗試使用隔離READ_UNCOMMITTED,但它不起作用。

我必須把這兩個操作放在同一個事務中,因爲任何失敗都應該回滾兩個操作,我不能提交第一個操作然後繼續到第二個操作。

我怎麼能在Spring框架中做到這一點?

在休眠

回答

3

通常,在同一事務中,while flushing(committing) it always follows a particular order.

Inserts首先執行,然後deletes而沖洗被執行。

所以最好是在你的情況,因爲你是deletinginsert之前就叫enitityManager.flush()delete後明確。

另外也看看EntityManager.setFlushMode()方法,您可以設置刷新模式類型到commitauto

+1

這洗淨模式真是笑死我了,怎麼來的默認刷新不是通過代碼順序......「這總是遵循特定的順序「,有沒有我可以參考的文檔?應該有一些原因... – GMsoF

+0

根據這個http://docs.oracle.com/javaee/6/api/javax/persistence/FlushModeType.html,我的配置應該默認爲「auto」,怎麼會來它不在「所有查詢執行」之前刷新? – GMsoF

+3

http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/event/def/AbstractFlushingEventListener.html#performExecutions%28org.hibernate.event.EventSource%29 – shankarsh15