2014-09-09 11 views
14

Ich möchte nur wissen, dass, wenn wir die Ausnahme in der Methode kommentiert mit der Annotation @Transactional, dann wird es zurückrollen, wenn eine Ausnahme auftritt?Spring @Transactional Annotation bei der Verwendung von try catch Block

Thanx im Voraus

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class) 
@Scheduled(cron = "0 0 0 31 3 ?") 
public void yearEndProcess(){  
    Company company = null; 
    try{ 
     --try block-- 


    } 
    catch(Throwable throwable){ 
     --catch block -- 
    } 
+0

versuchen Sie es in Ihrer Anwendung, ich nehme an, Sie verstehen, was '@ Transactional' tut. –

+0

@ user3404577 Können Sie uns Ihren Snippet-Code zeigen? – Skizzo

+0

@ user3404577 Wo ist enthalten ** yearEndProcess ** Methode? Die Klasse, die yearEndProcess enthält, ist ein Dienst, eine Komponente oder ein anderes adn implementiert schließlich einige Schnittstellen? – Skizzo

Antwort

10

beispiel

class A{ 

    @Transactional 
    public Result doStuff(){ 
     Result res = null; 
     try { 
      // do stuff 
     } catch (Exception e) { 

     } 
     return res ; 
    } 
} 

Wenn es eine Ausnahme bei dem Verfahren der doStuffTransaktion nicht zurückgerollt wird.

To rollback the exception programmatically können wir etwas wie unten tun.

deklarativen Ansatz

@Transactional(rollbackFor={MyException1.class, MyException2.class, ....}) 
public Result doStuff(){ 
    ... 
} 

programmatische Rollbacks Sie müssen es nennen von TransactionAspectSupport.

public Result doStuff(){ 
    try { 
    // business logic... 
    } catch (Exception ex) { 
    // trigger rollback programmatically 
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
    } 
} 

You are strongly encouraged to use the `declarative approach` to `rollback` if at all possible. 
`Programmatic rollback` is available should only be used if you absolutely need it. 
+1

Ich rufe diese Methode "yearendprocess" von einer anderen Methode des gleichen Objekts. Dies ist auch mit @transactional Annotation kommentiert. Würde es so funktionieren? –

+1

@ ankur-singhal, ich verstehe nicht, warum wir '@Transactional (rollbackFor = {MyException1.class, MyException2.class, ....})' 'brauchen? Der Standard 'rollbackFor' ist' Throwable', sollte er schon abgedeckt sein? – GMsoF

2

Sie würden this

Integriertes Transaktionsmanagement lesen möchten. Sie können Ihren ORM-Code entweder durch die @Transactional-Annotation oder durch explizites Konfigurieren des Transaktions-AOP-Hinweises in einer XML-Konfigurationsdatei mit einem deklarativen, aspektorientierten Programmier (AOP) -Stil-Methodenabfanggerät verknüpfen. In beiden Fällen werden die Transaktionssemantik und die Ausnahmebehandlung (Rollback usw.) für Sie erledigt. Wie weiter unten erläutert, können Sie im Ressourcen- und Transaktionsmanagement auch verschiedene Transaktionsmanager austauschen, ohne Ihren ORM-bezogenen Code zu beeinflussen. Sie können beispielsweise zwischen lokalen Transaktionen und JTA mit denselben vollständigen Services (wie deklarativen Transaktionen) wechseln, die in beiden Szenarien verfügbar sind. Darüber hinaus kann JDBC-bezogener Code vollständig mit dem Code, den Sie für ORM verwenden, transaktionsfähig sein. Dies ist nützlich für Datenzugriffe, die nicht für ORM geeignet sind, z. B. Stapelverarbeitung und BLOB-Streaming, bei denen gemeinsame Transaktionen weiterhin mit ORM-Operationen gemeinsam genutzt werden müssen.

2

Von Frühling Referenzen Dokumentation

Frühling empfiehlt, nur konkrete Klassen (und Methoden der konkreten Klassen) mit der @Transactional Annotation annotieren, als Schnittstellen zu annotieren gegenüber. Sie können die @Transactional Annotation auf eine Schnittstelle (oder eine Interface-Methode) platzieren, aber das funktioniert nur so, wie Sie es erwarten würden, wenn Sie interface-basierte Proxies verwenden. Die Tatsache, dass Java Annotationen nicht von Interfaces geerbt werden, bedeutet, dass wenn Sie klassenbasierte Proxies (proxy-target-class = "true") oder den webbasierten Aspekt (mode = "aspectj") verwenden, dann Transaktionseinstellungen werden von der Proxy- und Webinfrastruktur nicht erkannt, und das Objekt wird nicht in einen Transaktions-Proxy eingebunden, was ausgesprochen schlecht wäre.

Im Proxy-Modus (Standardeinstellung) werden nur externe Methodenanrufe, die über den Proxy eingehen, abgefangen.Dies bedeutet, dass Selbstaufruf, dh eine Methode innerhalb des Zielobjekts, die eine andere Methode des Zielobjekts aufruft, nicht zur tatsächlichen Transaktion zur Laufzeit führt, auch wenn die aufgerufene Methode mit @Transactional gekennzeichnet ist.

Dann ist mit @Transaction das Standardverhalten, dass jede RuntimeException Rollback auslöst, und alle aktivierten Exceptions nicht. Dann wird Ihre Transaktion für alle RuntimeException zurückgesetzt und für die ausgewählte Exception geworfen.

-1

Sie haben das Attribut rollbackFor = Throwable.class in Ihrer @Transactional Annotation bereits erwähnt.

Also, für jede Art von Ausnahme-Transaktion wird zurückgesetzt.

Verwandte Themen