2017-04-26 6 views
0

Ich habe eine App Grails (2.5.2), mit einer MySQL und einer NoSQL-Interaktion. Es gibt einen Haupt/Hauptleistung Methode, die zwei andere Methoden aufrufen:Warum funktioniert das Grails/Spring-Transaktionsverhalten in diesem Fall nicht?

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 
    } 

} 

Wie Sie sehen können, diese mainService neue Domäne Entitäten erstellt (1), die Sitzung Spülen der ids zu bekommen. Dann rufe ich andere Service-Methode (2), der die json in einem NoSQL-Schema speichern:

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 
    } 
    } 
} 

Aber manchmal die noSQLDataAccessService.set() nicht durch äußere Ursachen und die geschaffenen Einheiten vor noch in der mysql persistieren db. (das ist das Problem)

Die Speichermethode, die alle diese Programmausführung enthält, wird wie @Transactional markiert. Wenn also noSQLDataAccessService.set() eine Ausnahme auslöst, sollten alle vorgenommenen Änderungen nicht angewendet werden weil der Rollback. Ich habe recht?

Antwort

1

Sie müssen wahrscheinlich eine RuntimeException und keine Exception auslösen, um einen Rollback gemäß this StackOverflow conversation zu erzwingen. Statt:

throws ex 

Sie könnten versuchen:

throw new RuntimeException(ex) 

Des Weiteren würde ich empfehlen Sie über Ihre Transaktionsisolations explizit sein. Vielleicht etwas wie:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) 
Verwandte Themen