2012-06-18 28 views
5

Spring supporta la transazione programmatica che ci offre un controllo a grana fine sulla gestione TX. Secondo la documentazione primavera, si può utilizzare la gestione programmatica TX da:
1. utilizzando TransactionTemplate Primavera:Avviso programmatico di gestione delle transazioni di primavera?

transactionTemplate.execute(new TransactionCallbackWithoutResult() { 

protected void doInTransactionWithoutResult(TransactionStatus status) { 
    try { 
     updateOperation1(); 
     updateOperation2(); 
    } catch (SomeBusinessExeption ex) { 
     status.setRollbackOnly(); 
    } 
} }); 

2. sfruttando direttamente PlatformTransactionManager (iniettare un'implementazione PlatformTransactionManager in DAO):

DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
def.setName("SomeTxName"); 
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 

//txManager is a reference to PlatformTransactionManager 
TransactionStatus status = txManager.getTransaction(def); 
try { 
    updateOperation1(); 
    updateOperation2(); 
} 
catch (MyException ex) { 
    txManager.rollback(status); 
    throw ex; 
} 
txManager.commit(status); 

per per semplificazione, diciamo che abbiamo a che fare con l'operazione del database JDBC.

Mi chiedo per eventuali operazioni di database accaduto al updateOperation1(),updateOperation2() nel secondo frammento di, o si è implementato con JDBCTemplate o JDBCDaoSupport, in caso contrario, l'operazione è in realtà non viene eseguita all'interno di qualsiasi operazione, è vero?

La mia analisi è che se non usiamo JDBCTemplate o JDBCDaoSupport, inevitabilmente creeremo/recupereremo la connessione dalla gestione dell'origine dati. la connessione che otteniamo non è ovviamente la connessione utilizzata da PlatformTransactionManager sottostante per gestire la transazione.

ho scavato il codice sorgente primavera e scremato classe simile trovato che PlatformTransactionManager cercherà di recuperare un collegamento contenuto in ConnectionHolder che in cambio recuperato dal TransactionSynchronizationManager. Ho anche trovato JDBCTemplate e JDBCDaoSupport, cercano anche di ottenere la connessione con la routine simile da TransactionSynchronizationManager.

Perché TransactionSynchronizationManager gestisce molte risorse tra cui la connessione per thread (in pratica utilizzare Threadlocal per garantire un thread ottenere la propria istanza unica della risorsa gestita)

Quindi penso che la connessione recuperata da PlatformTransactionManager e JDBCTemplate o JDBCDaoSupport sia la stessa, questo può spiegare come la transazione programmatica di primavera assicuri che updateOperation1(),updateOperation2() sia protetta dalla transazione.

La mia analisi è corretta? se lo è, perché la documentazione di Spring non ha enfatizzato questo avvertimento?

risposta

2

Sì, è corretto.

Qualsiasi codice che utilizza prime Connection s loro dovrebbe ottenere dal DataSource in special modo, al fine di partecipare alle transazioni gestite da Spring (12.3.8 DataSourceTransactionManager):

codice dell'applicazione è necessario per recuperare la connessione JDBC attraverso DataSourceUtils .getConnection (DataSource) invece di standard DataSource.getConnection di Java EE.

Un'altra opzione (se non è possibile modificare il codice che chiama getConnection()) è quello di avvolgere il vostro DataSource con TransactionAwareDataSourceProxy.

Problemi correlati