2012-09-28 14 views
15

Wenn ich JdbcTemplate verwende, muss ich Transaktionen explizit konfigurieren?Spring's JdbcTemplate und Transaktionen

Mein Code Layout sieht wie folgt aus:

Ich werde eine UserDao haben, die in mein Userservice injiziert wird, und dann wird meine Controller fordert Methoden in meinem Userservice machen.

Ich möchte die Dinge so einfach wie möglich Transaktionsweise halten, und ich brauche nicht mehrere Datenbankaufrufe, um eine Transaktion zu überspannen.

Muss ich in meiner Konfigurationsdatei standardmäßig irgendetwas tun oder eine @Transaction Annotation verwenden?

Jetzt in meinem Controller sagen, ich muss 2 Aufrufe auf meinem UserService und AccountService, könnte ich es irgendwie in eine Transaktion wickeln irgendwie?

userService.updateUser(user); 
accountService.updateXXX(...); 

Antwort

21

Ja, JdbcTemplate ist kein Ersatz für die Transaktionsverwaltung. Sie profitieren immer noch von Datenbanktransaktionen, so dass userService.updateUser in einer Datenbank Transaktion ausgeführt wird, aber wenn accountService.updateXXX fehlschlägt, wird userService.updateUser wird nicht Rollback. Wenn Sie AOP nicht verwenden möchten, können Sie statt dessen TransactionTemplate verwenden. Siehe programmatic transaction management in der Spring Reference Documentation.

Ein Muster, das ich zuvor gesehen habe, ist, dass die MVC-Controller-Klasse einen Business-Service aufruft, der die Operation kapselt. Die Methode der Business-Klasse könnte dann mit @Transactional kommentiert werden.

+1

Wow, das ist eine Menge Code für eine Transaktion, @Transactional macht es weniger Vortex zu schreiben! – loyalflow

+0

Es ist, aber es ist sehr nützlich, wenn Sie auf den TransactionStatus zugreifen müssen. –

+1

+1 für die Geschäftsservice-Idee. Meines Erachtens wäre das Leben einfacher, wenn alle dies tun würden. – xdhmoore

9

Wenn Ihr Controller mehrere Dinge mit Benutzern und Konten erledigen möchte und alles innerhalb einer Transaktion passiert, dann sollten Sie einen Dienst mit einer Methode haben, die all diese Dinge erledigt. Es ist keine gute Idee, einen Dienst pro DAO zu erstellen, da Sie mit Do-nothing-Wrappern um DAOs herumkommen und die Verarbeitung langsam ist, da die Datenbank für jeden Aufruf eines DAO eine separate Transaktion erstellen muss viel mehr Arbeit als nötig sein sollte.

Der Dienst sollte dem Controller oder anderen Personen, die ihn aufrufen, Funktionen bereitstellen. Ich versuche, Dienste mit der Idee zu erstellen, dass der Dienst bestimmte Funktionen bereitstellt, die für einen bestimmten Benutzertyp nützlich sind.

+1

+1 abgeordnet. Dies erleichtert mehrere Dinge, einschließlich des Testens, und macht es einfach, wenn Sie Funktionalität einer anderen Ansicht als einem Controller (z. B. einer REST-API) zur Verfügung stellen müssen. – xdhmoore