2010-10-12 17 views
0

ok, c'est assez. Je ne pouvais pas faire ce travail. Je suis un débutant aux transactions de printemps et en utilisant l'annotation @Transactional dans mon service pour gérer les transactions. Ci-dessous est mon fichier de configuration de bean printemps.@ L'annotation transactionnelle ne fonctionne pas

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> 

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

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

    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/myapp"/> 

    <!-- other <bean/> definitions here --> 

</beans> 

et j'annoter mon service:

@Transactional 
public class MyServiceImpl implements MyService { 
... 
} 

Je remarque deux choses

  1. La connexion que je reçois dans mon DAO [en utilisant DataSourceUtils.getConnection (dsName)] a le autocommit enabled [true].
  2. Dans la mesure où j'ai débogué, il ne semble pas y avoir de transaction qui a commencé pendant l'appel de ma méthode de service.

Quelqu'un a eu ce problème?

+0

Juste pour être sûr: votre 'MyServiceImpl' est un bean Spring et non créé par' new', oui? – axtavt

+0

yep, son injection par le biais du printemps – santhakr

+1

santhakr: Une autre question - est votre 'MyServiceImpl' déclaré dans le même contexte d'application où vous avez' '? – axtavt

Répondre

0

J'utilise Hibernate avec le HibernateTransactionManager moi-même, donc je ne connais pas très bien le fonctionnement du gestionnaire de transactions JDBC. Avez-vous inspecté le callstack pour voir si TransactionInterceptor est là? Si c'est le cas, l'annotation transactionnelle fonctionne et il se peut que vous manquiez autre chose. Si tu ne l'as pas cherché, qu'est-ce qui te fait penser que ça ne marche pas? Pour éliminer l'évidence, avez-vous explicitement défini un paramètre dans votre configuration JDBC pour désactiver la validation automatique?

+0

Je ne vois pas de TransactionInterceptor dans ma pile d'appel - Dans la mesure où je comprends le code, la méthode doBegin de DataSourceTransactionManager n'a pas été invoquée car la méthode crée une connexion et rend explicitement le auto commit à false. Lorsque j'ai suivi mon débogueur, j'ai remarqué que la connexion est créée uniquement lors de l'appel DataSourceUtil.getConnection (dsName) [using dataSource.getConnection() avec autocommit enabled] et qu'il n'y en avait pas encore un disponible. – santhakr

+0

Vous n'avez pas défini l'espace de noms tx dans votre élément racine . Comment l'application démarre-t-elle? Vous devez avoir ceci dedans (comme l'espace de noms de jee) avant que vous puissiez commencer à employer les caractéristiques d'espace de noms de tx. –

+0

Désolé, c'est mal pour copier le code ici. J'ai l'espace de noms tx. Encore pardon. – santhakr