2013-08-14 20 views
14

Ho una classe con annotazione @Transactional (anziché contrassegnarla per tutto il suo metodo).Annotazione transazionale su tutta la classe + escluso un singolo metodo

Anche se ho un singolo metodo all'interno di quella classe che non dovrebbe essere annotato come @Transactional.

La mia domanda è c'è un'annotazione che posso inserire in questo metodo per contrassegnarlo come "non transazionale"? o dovrei iniziare a contrassegnare ogni singolo metodo in questa classe come "transazionale" escludendo questo metodo (molto lavoro)

grazie.

+1

hai provato '@Transactional (propagation = NOT_SUPPORTED)'? –

risposta

21

Esistono diverse strategie di propagazione delle transazioni da utilizzare. Questi esistono nell'enum Propagation. Quelli che potresti voler usare sono

/** 
* Execute non-transactionally, suspend the current transaction if one exists. 
* Analogous to EJB transaction attribute of the same name. 
* <p>Note: Actual transaction suspension will not work on out-of-the-box 
* on all transaction managers. This in particular applies to JtaTransactionManager, 
* which requires the {@code javax.transaction.TransactionManager} to be 
* made available it to it (which is server-specific in standard J2EE). 
* @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager 
*/ 
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), 

/** 
* Execute non-transactionally, throw an exception if a transaction exists. 
* Analogous to EJB transaction attribute of the same name. 
*/ 
NEVER(TransactionDefinition.PROPAGATION_NEVER), // maybe not this one 

Quindi annota il metodo all'interno della tua classe con uno di questi.

@Transactional 
public class MyTransactionalClass { 
    @Transactional(propagation = PROPAGATION_NOT_SUPPORTED) 
    public void nonTransactionalMethod() {...} 
} 

È possibile trovare tutte le strategie di propagazione here.

+0

Mi ha aiutato a risolvere il problema con "readOnly = true" non funzionante –

+0

Il suggerimento delle opzioni NOT_SUPPORTED o NEVER non è una risposta esauriente. Gli sviluppatori dovrebbero fare molta attenzione ad usarlo poiché potrebbe causare eccezioni impreviste in fase di esecuzione. L'opzione NOT_SUPPORTED potrebbe non funzionare se la sospensione della transazione non è supportata (vedi javadoc). MAI genererà un'eccezione se il metodo viene chiamato accidentalmente all'interno di una transazione. Gli sviluppatori dovrebbero considerare le opzioni di SUPPORTO che funzioneranno felicemente ovunque venga chiamato. A meno che MAI non sia intenzionalmente progettato. – coolersport