2017-04-26 104 views
0

我有一個grails(2.5.2)應用程序,有一個mysql和一個NoSQL交互。有調用2種方法爲主/主要服務方法:爲什麼在這種情況下Grails/Spring事務行爲不起作用?

class mainService { 

    static transactional = false 
    NoSQLDataAccessService noSQLDataAccessService 

    // main/principal method 
    @Transactional 
    void save(json){ 

    // (1) creating domain entities from json 
    addNewDomainEntities(entities) 

    // (2) 
    noSQLDataAccessService.set(json) 
    } 

    @Transactional 
    void addNewDomainEntities(entities){ 
    // save the entities in a mysql schema and use save(flush:true) 
    // because i need the generated id's 
    } 

} 

正如你可以看到,這個mainService創造了新的領域實體(1),沖洗會議獲得的ID。然後,我打電話了JSON存儲在NoSQL的架構等服務方法(2):

class NoSQLDataAccessService(){ 

    static transactional = false 

    void set(json){ 
    try{ 
    // save the json in a NoSQL schema 
    } catch(Exception ex){ 
     // if fails, i log the exception and throws it again 
     throws ex 
    } 
    } 
} 

但是,有時noSQLDataAccessService.set()失敗的外部原因之前仍會創建實體堅持在mysql db。(這是問題)

包含所有此程序執行的save方法標記爲@Transactional,因此如果noSQLDataAccessService.set()引發異常,則應該不應用所做的所有更改因爲回滾。我是對的?

回答

1

根據this StackOverflow conversation,您可能必須拋出RuntimeException而非Exception,才能強制回滾。相反的:

throws ex 

你可以嘗試:

throw new RuntimeException(ex) 

此外,我建議你可以明確你的事務隔離。也許是這樣的:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) 
相關問題