2012-03-10 15 views
12

Sto usando Spring con JDBC e ho scoperto che è autocommit.Come posso configurare per disattivare l'autocommit in Spring + JDBC?

Come posso configurare lo spegnimento in spring-servlet.xml?

Questa è la mia configurazione attuale:

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" 
    p:driverClassName="${jdbc.driverClassName}" 
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" 
    p:password="${jdbc.password}" /> 

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

risposta

14

Sembra che la mia configurazione perdere questa linea:

<tx:annotation-driven transaction-manager="txManager"/> 

Poi, nelle mie classi di servizio, io uso @Transactional annotazione. Per esempio

@Service 
class CompanyServiceImpl implements CompanyService{ 
    @Autowired 
    private CompanyDAO companyDAO; 

    @Transactional 
    public void addCompany(Company company) { 
      companyDAO.addCompany(company); // in here, there is JDBC sql insert 
      companyDAO.addCompany_fail(company); // just for test 
    } 
} 

Se c'è un'eccezione accade nel addCompany_fail(), il primo addCompany() si sarà anche annullate da una rollback.

Ho seguito questo documento per capire come si gestiva la transazione in primavera. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

Ho seguito questo documento per capire come codificare con JDBC in primavera. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

Ho letto anche questo (gratuito) http://www.infoq.com/news/2009/04/java-transaction-models-strategy. È davvero buono. E sento lo stesso con lo scrittore che la maggior parte delle persone non capisce (o cura) della transazione.

PS: Sembra che molte persone fraintendano che l'utilizzo di tale framework Hibernate/Spring è solo per evitare la complessità di JDBC e Transaction Control. Molte persone pensano che "JDBC e Transaction sono così complesse, basta usare Hibernate e dimenticare quei due". Molti esempi su Internet di Spring + Hibernate o Spring + JDBC sembrano non interessare affatto alla transazione. Sento che questo è un brutto scherzo. La transazione è troppo seria per aver semplicemente permesso a qualcosa di gestirlo senza una vera comprensione.

Hibernate e Spring sono così potenti e così complessi. Quindi, come qualcuno ha detto, "Il grande potere arriva con le responsabilità".

AGGIORNAMENTO: 2013-08-17: C'è un buon esempio di transazione qui . Tuttavia, questo non è spiegare che se si desidera utilizzare REQUIRES_NEW, perché è necessario creare un'altra classe (in caso contrario si otterrà questo problema Spring Transaction propagation REQUIRED, REQUIRES_NEW, che a quanto pare REQUIRES_NEW in realtà non creare una nuova transazione)

Aggiornamento: 2018 -01-01: Ho creato un esempio completo con Spring Boot 1.5.8.STAMPA qui https://www.surasint.com/spring-boot-database-transaction-jdbi/ e alcuni esempi di esperimento di base qui https://www.surasint.com/spring-boot-connection-transaction/

+0

E questo ha funzionato perché il gestore delle transazioni Spring disattiva il commit automatico e esegue i propri commit? – Raedwald

2

Non si può, semplicemente eseguire il codice all'interno di una transazione, Primavera disabilita automaticamente auto-commit per voi. L'(almeno per set-up) modo più semplice per eseguire un pezzo di codice in una transazione in primavera è quello di utilizzare TransactionTemplate:

TransactionTemplate template = new TransactionTemplate(txManager); 

template.execute(new TransactionCallback<Object>() { 
    public Object doInTransaction(TransactionStatus transactionStatus) { 
    //ALL YOUR CODE ARE BELONG TO... SINGLE TRANSACTION 
    } 
} 
+0

Grazie per la risposta. Per supportare un'immagine più ampia, sembra che Spring crei molta più complessità per il semplice jdbc. :) –

+0

@SurasinTancharoen: beh, non proprio. Ho detto più facile * per impostare *, ma non per usare. Con '@ Transactional' o AOP è possibile eseguire diverse righe di codice all'interno di una singola transazione con modifiche minime al codice. –

+0

Ho appena letto questo http://www.ibm.com/developerworks/java/library/j-ts2/index.html "Le transazioni programmatiche con Spring" possono essere un'alternativa? –

Problemi correlati