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 @Transactionaldann 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

Schreibe einen Kommentar