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?