2017-02-20 91 views
2

目前,我正在使用Spring 4.0.6和Postgresql 9.5。我打電話一個serviceClass1到另一個serviceClass2,卻得到了異常的交易如下:在這個地方Spring和Postgres事務錯誤

serviceClass1.class

`@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor= { Throwable.class }) 
public Map<String, Object> storeUsersList(Map<String, Object> mapOfParams) throws Exception { 
    Map<String, Object> returnMap = new HashMap<String, Object>(); 
if (userListToStore != null && !userListToStore.isEmpty()) {     
integrationService.manangePassCodes(org,userListToStore.size()); 
       for (Users singleUser : userListToStore) { 
        try { 
         getEm().update(singleUser);` 

serviceClass2.class

@Override 
@Transactional(readOnly=false,propagation=Propagation.REQUIRED 
    ,rollbackFor{Throwable.class}) 
public void manangePassCodes(Organizations org,int userToRegisterCount)throws Exception{ 
//some Logic 

在這裏我得到異常 - getEm().update(singleUser);

異常SQL狀態[25P02];錯誤代碼[0];不能提取 的ResultSet

剛纔我看到有關此錯誤的Postgres左右交易,但沒能得到我應該怎麼使用Hibernate的。

回答

1

感謝迅速的幫助,我有我的問題要解決檢查更多並閱讀上述錯誤消息。我從單個事務中調用了許多事務,這意味着在我的情況下,由於之前的事務錯誤接下來會中止,因爲它在DB上有寫入鎖定。並且您的當前交易將不會保存,直到您解決前一個交易。 上一個有愚蠢錯誤的交易getEm().update(singleUser); 其中有什麼不對當前事務integrationService.manangePassCodes(org,userListToStore.size‌()); 一段代碼 由於兩個屬於不同的服務,但我已經與 @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = { Throwable.class }) 傳播註釋= Propagation.REQUIRED意味着它將支持當前事務,如果不存在,創建一個新的。 所以它給了我錯誤25P02 - 事務中止。

參考鏈接1 - postgresql.org/message-id/[email protected]

參考鏈接2 - postgresql.org/docs/9.4/static/errcodes-appendix.htm

參考鏈接3 - https://www.postgresql.org/message-id/8829.1173816732%40sss.pgh.pa.us

1

不是100%確定如果是這種情況,而是在您的storeUsersList方法中,您似乎正在重新使用存儲在實例變量userListToStore中的已存在User集合。

這個用戶集合不是從事務內部初始化的,所以實體最有可能被分離,因爲你正在使用容器管理的事務。

在我看來,你應該合併的每個實體執行更新之前,這樣的持久化上下文是意識到它們的存在:

for (Users singleUser : userListToStore) { 
     try { 
     getEm().merge(singleUser); 
     getEm().update(singleUser); 
+0

感謝,但我已經通過檢查越來越閱讀有關此錯誤消息解決了我的問題,我的結論是,保存錯誤不在'getEm()。update(singleUser);' – ThinkTank

+0

對於現有評論感到抱歉。 謝謝,但我通過檢查更多並閱讀上述錯誤消息解決了我的問題。 這意味着先前的事務被中止接下來無法繼續保存錯誤不在'getEm()。update(singleUser);' ,而它在'integrationService.manangePassCodes(org,userListToStore。size());'一段代碼 參考鏈接1 - https://www.postgresql.org/message-id/[email protected] 參考鏈接2 - https://www.postgresql .ORG /文檔/ 9.4 /靜態/ errcodes-appendix.html – ThinkTank