Spring @Transactional Erbe Regeln
Habe ich eine Reihe von @Service
Bohnen, die Erben core-Funktionalität, die von einer abstrakten Klasse. Ich markierte jeweils die konkreten sub-class-services mit @Service
und @Transactional
. Die abstrakte super-Klasse enthält die public-Eintrag-Punkt-Methode für jeden dieser Dienste. In anderen Worten, ich habe so etwas ähnliches wie die folgenden:
abstract class AbstractService {
public void process() {
//Do common initialisation code here
processSpecific();
//Do common completion code here
}
abstract protected void processSpecific();
}
@Service @Transactional
public class FirstSpecificService extends AbstractService {
protected void processSpecific() {
//Do specific processing code here
}
}
@Service @Transactional
public class SecondSpecificService extends AbstractService {
protected void processSpecific() {
//Do different specific processing code here
}
}
Den spezifischen code-im konkreten sub-class-service macht mehrere Aufrufe der DAO Schicht, um änderungen an der Datenbank, die REQUIRED
wie die Transaktions-Vermehrung geben.
Nun mit den definierten Leistungen wie oben, entdeckte ich, dass es keine aktuelle Transaktion innerhalb der code dieser konkreten sub-class-services, und jeder Aufruf der DAO-Schicht wurde die Schaffung einer neuen Transaktion, tun die änderungen, commit für die Transaktion ausgeführt und der Rückkehr.
Jedoch, wenn ich das anmerken von der abstrakten super-Klasse mit @Transactional
dann eine Transaktion ist ordnungsgemäß erstellt und der sub-Anrufe auf die DAO-Schicht alle teilnehmen, die in der aktuellen Transaktion.
Also meine Frage ist, was sind die Regeln für die Erben der @Transactional
Verhalten? Warum kommt der Frühling nicht verwenden die @Transactional
auf die konkreten sub-Klasse Dienste, es ist eigentlich instanzieren ist? Hat die @Transactional
brauchen, um auf dem super-Klasse, in diesem Fall, weil das ist, wo die öffentliche entry-point-Methode ist?
InformationsquelleAutor der Frage DuncanKinnear | 2012-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Feder Transaktion Dokumentation,
Obwohl Sie die @Transactional auf Ihre konkrete Umsetzung und Sie anrufen process-Methode, die ist eigentlich transaktionale durch deine Anmerkung, aber der process-Methode aufrufen processSpecific auf Ihre sub-Klasse ist nicht transaktional, weil dieser interne Aufruf.
Blick in die Weberei.
InformationsquelleAutor der Antwort Kathir
Haben Sie Lesen Sie den Teil über transaction propagation und wie es konfiguriert werden kann, mit @Transaktions -?
Ein weiterer Bereich von Interesse ist, dass der Frühling empfiehlt, dass Sie sollten kommentieren von konkreten Klassen (wie gegen zu kommentieren Schnittstellen).
InformationsquelleAutor der Antwort matsev