2017-11-12 1 views
0

Ich bin neu in Play Framework und verwendet, um Transaktionen in Java/Spring-Stil mit Controller, Transaktionsservice und Dao-Schichten zu verwalten. Es ist ziemlich üblich für mich, multiple Operationen mit Dao in Service-Methode zu haben und ihn @Transactional zu veranlassen, alle Änderungen rückgängig zu machen, wenn etwas schief geht. Service von dao isoliert und nichts über die Datenbank wissen.Transaktionsverwaltung in Play Framework (Scala)

Aber ich habe so etwas in Anorm Framework und Play nicht gefunden. Alle Logik in Controller platziert und Sie können Transaktion machen nur diese hässliche Art und Weise - Database transactions in Play framework scala applications (anorm)

Wir mehrere Probleme haben sich hier:

  1. Dienst verwandelt sich in dao
  2. Wenn wir gleiche dao Verfahren von einem anderen Dienst aufrufen müssen Wir haben es auf die gleiche Weise geändert

Gibt es eine nette Möglichkeit, Transaktionen in Play zu verwalten? Andere Frameworks wie Slick? Verwendung von Play in production mit solchen Einschränkungen

+0

Siehe "DB.withTransaction" – cchantep

+0

es war in Frage wie Beispiel für hässliche Lösung. Oder ich weiß nicht, wie man es richtig kocht ... –

+0

Das ist richtig, wenn du es auf die hässliche Art findest, die du brauchst, um das Dokument zu lesen :) – cchantep

Antwort

0

Anorms DB.withTransaction erstellt und schreibt eine Transaktion, wenn sie beendet wird. Daher gibt es keine standardmäßige Unterstützung für Ihren Anwendungsfall. Obwohl es ziemlich einfach ist, eine eigene Transaktions-Engine auf der Basis von Anorms Angebot zu erstellen, das mehrere Services umfasst: Es erstellt eine Transaktion, wenn keine in ThreadLocal vorhanden ist und speichert sie dort oder verwendet die daraus gewonnene in transaktionalen Verwendungen. Dann könnten Sie eine große Transaktion haben, die bei einem Fehler tief in der Dao-Ebene rollt. Wir haben eine solche Lösung in der Produktion und funktionieren gut.

Es gibt jedoch ein konzeptionelles Problem, das Sie beachten sollten. Sobald Sie einen Service anrufen müssen, der ein Future zurückgibt, haben Sie die Transaktion nicht mehr (Sie sind möglicherweise in einem anderen Thread) oder Sie sollten blockieren (was in der Produktion nicht gut ist).

Verwandte Themen