Warum funktioniert das Transaktionsverhalten von Grails/Spring in diesem Fall nicht?


Fco

Ich habe eine Grals-(2.5.2)-App mit einer MySQL- und einer NoSQL-Interaktion. Es gibt eine Haupt-/Hauptdienstmethode, die 2 andere Methoden aufruft:

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, erstellt dieser mainService neue Domänenentitäten (1) und leert die Sitzung, um die IDs zu erhalten. Dann rufe ich eine andere Dienstmethode (2) auf, die das Json in einem NoSQL-Schema speichert:

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 schlägt noSQLDataAccessService.set() durch externe Ursachen fehl und die zuvor erstellten Entitäten verbleiben weiterhin in der MySQL-Datenbank. (Dies ist das Problem)

Die save-Methode, die alle diese Programmausführungen enthält, wird als @Transactional markiert. Wenn also noSQLDataAccessService.set() eine Ausnahme auslöst, sollten alle vorgenommenen Änderungen wegen des Rollbacks nicht übernommen werden. Ich habe recht?

Augustearth

Sie müssen wahrscheinlich eine RuntimeException, keine Exception, auslösen, um ein Rollback gemäß dieser StackOverflow-Konversation zu erzwingen . Anstatt von:

throws ex

du könntest versuchen:

throw new RuntimeException(ex)

Darüber hinaus würde ich Ihnen empfehlen, Ihre Transaktionsisolation explizit anzugeben. Vielleicht sowas wie:

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

Verwandte Artikel


Warum funktioniert das Inkrement in diesem Fall nicht?

kirbysdreamland55 Diese bestimmte Schleife füllt ein Array, das Stück für Stück für eine Binärzahl steht. Ich versuche mit dem ternären Operator zu überprüfen, ob die vom Benutzer eingegebene Nummer entweder '0' oder '1' ist. while (i < 8) { printf("Bit %d

Warum funktioniert das Akkordeon in diesem Fall nicht?

Sadiqur Rahman Ich habe versucht, ein Akkordeon mit HTML, CSS und JavaScript zu erstellen. HTML und CSS funktionieren gut, aber die Javascript-Implementierung funktioniert nicht. Kann mir jemand helfen? Dateien sind hier: https://drive.google.com/drive/folders

Warum funktioniert Javascript Async in diesem Fall nicht?

kev Ich bin relativ neu in Javascript und konnte keinen Weg finden, meinen Code auf ein Ergebnis warten zu lassen, bevor er die nächsten Schritte ausführt. Ich habe einige Nachforschungen über Rückrufe angestellt, aber ich kann nicht scheinen, dass es mit mein

Warum funktioniert gieriger Ansatz in diesem Fall nicht?

Mirgee Ich versuche das folgende SPOJ-Problem zu lösen . Die Eingabe ist: 1. Gesamtgewicht eines bestimmten Geldbetrags in Münzen, 2. Werte und entsprechende Gewichte der Münzen der verwendeten Währung. Ziel ist es, den minimal möglichen Geldwert des gegebenen