2014-09-09 11 views
14

Voglio solo sapere che se rileviamo l'eccezione nel metodo annotato con l'annotazione @Transactional, verrà ripristinata se si verifica un'eccezione?Spring @Tenuta transazionale quando si utilizza il blocco catch try

Grazie in anticipo

@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

Provalo nella tua applcazione, presumo tu capisca cosa fa "@ Transactional". –

+0

@ user3404577 Puoi mostrarci il tuo codice snippet? – Skizzo

+0

@ user3404577 Dove è contenuto il metodo ** yearEndProcess **? La classe che contiene yearEndProcess è un servizio, componente o altro e finalmente implementa alcune interfacce? – Skizzo

risposta

10

ad esempio

class A{ 

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

     } 
     return res ; 
    } 
} 

se v'è un'eccezione nel metodo doStuff la transazione non viene ripristinata.

To rollback the exception programmatically, possiamo fare qualcosa di simile di seguito.

approccio dichiarativo

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

rollback programmatico è necessario chiamare da 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

Sto chiamando questo metodo "yearendprocess" da qualche altro metodo dello stesso oggetto. Che è anche annotato con annotazione @transactional. Funzionerebbe in questo modo? –

+1

@ ankur-singhal, non capisco perché abbiamo bisogno di '@Transactional (rollbackFor = {MyException1.class, MyException2.class, ....})'? Il 'rollbackFor' predefinito è' Throwable', dovrebbe già essere coperto? – GMsoF

2

si vorrebbe leggere this

integrata gestione delle transazioni. È possibile avvolgere il codice ORM con un intercettatore del metodo di stile dichiarativo, orientato all'aspetto (AOP) tramite l'annotazione @Transactional o configurando esplicitamente la consulenza AOP della transazione in un file di configurazione XML. In entrambi i casi, la semantica delle transazioni e la gestione delle eccezioni (rollback e così via) vengono gestite automaticamente. Come discusso di seguito, in Gestione risorse e transazioni, è anche possibile scambiare vari gestori delle transazioni, senza influire sul codice relativo a ORM. Ad esempio, è possibile scambiare tra transazioni locali e JTA, con gli stessi servizi completi (come le transazioni dichiarative) disponibili in entrambi gli scenari. Inoltre, il codice relativo a JDBC può integrarsi completamente a livello transazionale con il codice che si utilizza per eseguire ORM. Questo è utile per l'accesso ai dati che non è adatto per ORM, come l'elaborazione batch e lo streaming BLOB, che devono ancora condividere le transazioni comuni con le operazioni ORM.

2

Dalla documentazione riferimenti primavera

Primavera consiglia di annotare solo classi concrete (e metodi di classi concrete) con l'annotazione @Transactional, al contrario di annotare le interfacce. È certamente possibile posizionare l'annotazione @Transactional su un'interfaccia (o un metodo di interfaccia), ma questo funziona solo come ci si aspetterebbe se si utilizzano proxy basati su interfaccia. Il fatto che le annotazioni Java non siano ereditate dalle interfacce significa che se si utilizzano i proxy basati sulla classe (proxy-target-class = "true") o l'aspetto basato sulla tessitura (mode = "aspectj"), quindi il le impostazioni della transazione non vengono riconosciute dall'infrastruttura di proxy e tessitura e l'oggetto non verrà incapsulato in un proxy transazionale, il che sarebbe decisamente negativo.

In modalità proxy (che è l'impostazione predefinita), solo le chiamate del metodo esterno che arrivano attraverso il proxy sono intercettate .Ciò significa che l'autoinvocazione, in effetti, un metodo all'interno dell'oggetto target che chiama un altro metodo dell'oggetto target, non porterà a una transazione effettiva in fase di esecuzione anche se il metodo invocato è contrassegnato con @Transactional.

Quindi con @Transaction il comportamento predefinito è che qualsiasi RuntimeException attiva il rollback e qualsiasi eccezione verificata non lo fa. Quindi il rollback della transazione per tutte le RuntimeException e per l'Exception Throwable verificata

-1

Hai già menzionato l'attributo: rollbackFor = Throwable.class nell'annotazione @Transactional.

Quindi, per qualsiasi tipo di eccezione verrà eseguito il rollback della transazione.

Problemi correlati