2012-07-24 68 views
1

在對數據庫執行一堆查詢之後,我從Spring Transaction(標有@Transactional的Spring服務)調用存儲過程。如何使存儲過程中的查詢知道Spring事務?

entityManager.createNativeQuery("call stored_procedure()"); 
query.executeUpdate(); 

爲了使存儲過程回滾的查詢時的異常是由Java代碼引發(或DB在javacode所做的修改軋製因爲在存儲過程中引發的異常的背面) ,我已經將mysql服務器的autocommit變量設置爲false。 這解決了我的問題的一部分。我現在擁有所有的DB事務處理代碼。我的問題是存儲過程的查詢不知道在java代碼中所做的修改(對數據庫)。即來自存儲過程的選擇讀取Spring事務開始之前DB中的值。

我的問題是(標題中指出的)如何使存儲過程中的查詢意識到在調用存儲過程之前(來自該事務)在Spring事務中對DB進行的修改?

不幸的是,將數據庫設置爲髒讀不是現在的選項。 是否可以獲取Spring在mysql上打開的事務的ID,並在該事務中運行存儲過程的查詢?

感謝

+0

您是否使用START TRANSACTION/COMMIT ROLLBAcK顯式管理您的存儲過程的事務? – gkamal 2012-07-24 10:20:50

+0

不,我已經將autocommit設置爲false,以便讓Spring提交或回滾存儲過程中的查詢。這樣可以回滾Spring和Stored Procedure中的查詢。 – Romeo 2012-07-24 10:26:25

回答

0

原來我需要調用平齊的實體管理器,以便同步持久化上下文的基礎數據庫。我還刪除了SP的任何交易管理指令,並按預期工作;存儲過程中的查詢現在是Spring管理的事務的一部分。