2016-11-28 47 views
1

我試圖將SDN(4.2.0.M1)和neo4j-ogm(2.0.5)的版本升級到最新快照4.2.0.BUILD-SNAPSHOT2.1.0-SNAPSHOTSDN遷移到4.2:@Transactional如何工作?

按照遷移指南和其他SO問題的一些建議,我已經包裝了所有與neo4j 會話@Transactional交互的方法。它在大多數情況下工作正常,但仍有一些例外(Transaction is not current for this thread),我無法理解。

讓我舉一個例子:

@Service 
public class ContactServiceImpl implements ContactService { 

    @Inject 
    private Session session; 

    //... 

    @Override 
    @Transactional 
    public void addContact(String userId, String contactId) { 
     Contact contact = new Contact(); 
     // Fill contact data 

     session.save(contact); 
    } 

    @Override 
    public void addContacts(String userId, Set<User> newContacts) { 
     for (User contact : CollectionUtils.emptyIfNull(newContacts)) { 
      addContact(userId, contact.getId()); 
     } 
    } 
} 

在這裏,我只能用@TransactionaddContact註釋的方法,因爲它是與SDN direcly交互的唯一一個,至少這是我的想法:)

但是,如果我叫addContacts方法,它只是一個迭代列表並調用註解addContact方法,它失敗,之前提到的異常。如果我也註釋這種方法,它只是運作良好,但我不明白爲什麼。也許我錯過了一些關於spring @Transactional註解行爲的基礎知識,所以很抱歉,如果這是一個毫無意義的問題。

任何人都可以澄清爲什麼我需要註釋兩種方法嗎? 在此先感謝

回答

1

@Transactional是一個比較複雜的比大多數人的想法。看起來它應該工作實際上不,有時反之亦然。

在你的情況下,你遇到了一個不友好的春季問題:當從同一個類內調用交易方法時,不知道@Transactional AOP代理如何工作。

This snippet from the official documenation是一個很好的起點,以獲取有關Spring的事務代理的基礎知識一個粗略的想法。

快速搜索StackOverflow上的給我帶來this answer這很好地解釋你所看到的現象,一個偉大的工作。

注意:從版本4.2開始,SDN現在完全實現了Spring Transaction Platform。

+0

如果您需要更多詳細信息,請添加評論,我會擴展我的答案。 – digx1

+0

謝謝@ digx1!在問這個問題之前,我應該多查找一下,但我理所當然地認爲這個問題可能與SDN遷移有關,我的錯誤:)感謝這兩個鏈接,現在都是有道理的 – troig