web-dev-qa-db-fra.com

Comment puis-je configurer pour désactiver la validation automatique dans Spring + JDBC?

J'utilise Spring avec JDBC et j'ai constaté qu'il s'agit d'un autocommit.

Comment puis-je configurer pour le désactiver dans spring-servlet.xml?

Voici ma configuration actuelle:

<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>
13
Surasin Tancharoen

Il semble que ma configuration ait raté cette ligne:

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

Ensuite, dans mes classes de service, j'utilise l'annotation @Transactional. Par exemple

@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
    }
}

Si une exception se produit dans addCompany_fail (), la première addCompany () sera également annulée.

J'ai suivi ce document pour comprendre comment le contrôle des transactions au printemps. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

J'ai suivi ce document pour comprendre comment coder avec JDBC au printemps. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

J'ai également lu ceci (gratuit) http://www.infoq.com/news/2009/04/Java-transaction-models-strategy . C'est vraiment bon. Et je ressens la même chose avec l'écrivain que la plupart des gens ne comprennent pas (ou ne se soucient pas) des transactions.

PS: Il semble que beaucoup de gens comprennent mal que l'utilisation de ce cadre Hibernate/Spring sert uniquement à éviter la complexité de JDBC et de Transaction Control. Beaucoup de gens pensent que "JDBC et Transaction sont si complexes, utilisez simplement Hibernate et oubliez ces deux". De nombreux exemples sur Internet concernant Spring + Hibernate ou Spring + JDBC ne semblent pas du tout se soucier des transactions. Je pense que c'est une mauvaise blague. La transaction est trop sérieuse pour laisser simplement quelque chose la gérer sans vraiment la comprendre.

Hibernate and Spring est si puissant et si complexe. Puis, comme quelqu'un l'a dit, "Un grand pouvoir s'accompagne de responsabilités".

MISE À JOUR: 17/08/2013: Il y a un bon exemple de transaction ici http://www.byteslounge.com/tutorials/spring -transaction-propagation-tutorial . Cependant, cela n'explique pas que si vous souhaitez utiliser REQUIRES_NEW, pourquoi vous devez créer une autre classe (sinon vous obtiendrez ce problème propagation de la transaction Spring REQUIRED, REQUIRES_NEW , qui semble ne pas être vraiment créé par REQUIRES_NEW) une nouvelle transaction)

Mise à jour: 01-01-2018: J'ai créé un exemple complet avec Spring Boot 1.5.8.RELEASE ici https: // www .surasint.com/spring-boot-database-transaction-jdbi / et quelques exemples d'expérience de base ici https://www.surasint.com/spring-boot-connection-transaction/

15
Surasin Tancharoen

Essayez la propriété defaultAutoCommit. Le code ressemblerait à ceci:

<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}"
p:defaultAutoCommit="false" />

Regardez javadoc: http://commons.Apache.org/dbcp/apidocs/org/Apache/commons/dbcp/BasicDataSource.html#defaultAutoCommit

6
kapeloland

Vous ne pouvez pas, exécutez simplement votre code dans une transaction, Spring désactivera automatiquement la validation automatique pour vous. La façon la plus simple (au moins pour la configuration) d'exécuter un morceau de code dans une transaction au printemps est d'utiliser TransactionTemplate :

TransactionTemplate template = new TransactionTemplate(txManager);

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