2011-11-17 42 views
4

只是有一點背景,我是一個新開發誰最近採取了一個重大項目後的高級開發人員離開公司之前,我可以開發的,他如何構成的這個充分的認識。我會盡我所能解釋我的問題。方法上的Spring bean掛起使用@Transactional

此應用程序創建幾個MessageListner線程以從JMS隊列讀取對象。一旦收到對象,數據就會根據一些業務邏輯進行操作,然後映射到一個持久化對象,並使用hibernate EntityManager將其保存到一個oracle數據庫中。

直到幾個星期前還沒有在過去的一年多以來,我加入了這個項目配置的任何重大問題。但是對於其中一個隊列(問題與這個特定的隊列隔離),處理接收到的對象的spring託管bean在下面的方法中掛起。我的調試使我得出結論,它已經完成了方法中的所有內容,但是完成時會掛起。經過數週的努力解決這個問題之後,我終於解決了這個問題。任何幫助,這將不勝感激。

由於每個MessageListner都有自己的處理器,所以這種掛起方法隻影響一個隊列上的傳入數據。

@Transactional(propagation = Propagation.REQUIRES_NEW , timeout = 180) 
public void update(UserRelatedData userData, User user,Company company,...) 
{ 
    ... 
    .... 
    //business logic performed on user object 
    .... 
    ...... 
    entityMgr.persist(user); 

    //business logic performed on userData object 
    ... 
    .... 
    entityMgr.persist(userData); 

    ... 
    .... 

    entityMgr.flush(); 

} 

我插入調試語句只是爲了遍歷該方法,它完成了包括entityMgr.flush。()在內的所有事情。

回答

4

當底層數據庫鎖定了未提交的更改時,可能會出現此類問題。

我會懷疑是一些其他的代碼製作的,外面的事務或者這需要很長的時間來執行,因爲這是一個批處理作業或類似交易的用戶數據表(S)的插入/刪除。您應該分析引用這些表的所有代碼並查找缺少的@Transactional。

+0

這是一箇舊的,但我回去評論,以防萬一有人有類似的問題。原來這是數據庫的問題。經過幾次與DBA的會議後,我們終於解決了問題。 – Rhouujin

+0

是什麼問題? – Robocide

0

除了this answer之外,您還可能檢查您的交易的隔離級別—,這可能是太嚴格了。

是否update()方法永遠掛,或者它拋出一個異常,當超時時間?

+0

更新方法永遠掛起,目前與高級開發人員一起工作,以查看我們是否可以確定這是否是表上的阻塞問題。 – Rhouujin

1

不幸的是我有與Propagation.REQUIRES_NEW相同的問題。刪除它可以解決問題。調試器向我顯示提交方法掛起(從@Transactional方面實現中調用)。

該問題僅出現在測試春季上下文中,當應用程序部署到應用程序服務器時,它工作正常。

2

REQUIRES_NEW可以在測試範圍內掛起,因爲在單元測試中使用的事務管理器不支持嵌套事務... 從JpaTransactionManager接口的Javadoc中:

* <p>This transaction manager supports nested transactions via JDBC 3.0 Savepoints. 
* The {@link #setNestedTransactionAllowed "nestedTransactionAllowed"} flag defaults 
* to {@code false} though, since nested transactions will just apply to the JDBC 
* Connection, not to the JPA EntityManager and its cached entity objects and related 
* context. You can manually set the flag to {@code true} if you want to use nested 
* transactions for JDBC access code which participates in JPA transactions (provided 
* that your JDBC driver supports Savepoints). <i>Note that JPA itself does not support 
* nested transactions! Hence, do not expect JPA access code to semantically 
* participate in a nested transaction.</i> 

所以很明顯,如果你不叫( @Java配置)或設置等同標誌在你的XML配置:

txManager.setNestedTransactionAllowed(true); 

,或者如果你的驅動程序不支持保存點,這是「正常」與REQUIRES_NEW獲得問題... (有些人可能更喜歡EXCE 「不支持嵌套的交易」)

相關問題