2010-12-08 50 views
0

Je construis actuellement un ressort d'utilisation d'application comme cadre. et je veux tester la transaction par lots en utilisant le printemps. voici mon code:spring @Transactional ne fonctionne pas?

public class SqlMapTestDao extends SqlMapClientDaoSupport implements TestDao { 

public List<Test> getAllTest() { 
    return getSqlMapClientTemplate().queryForList("getAllTest"); 
} 

public Test getTest(int param) { 
    return (Test)getSqlMapClientTemplate().queryForObject("getTest" , param); 
} 

public void insertTest(Test test) { 
    getSqlMapClientTemplate().insert("insertTest", test); 
} 

@Transactional(readOnly = false) 
public void insertBatch(List<Test> batch) throws SQLException{  
    for(Test test : batch) { 
     getSqlMapClientTemplate().insert("insertTest", test); 
    }    
} 
} 

et j'essaie d'insérer une même clé primaire comme ci-dessous. Quand il s'exécute avec l'ID 1, il va lancer l'erreur, et je m'attends à ce que toutes les requêtes soient annulées. mais 7 entrer dans la base de données. pourquoi il ne peut pas reculé? Où ai-je tort? J'utilise ibatis et mysql comme base de données.

et voici la configuration xml:

<!-- Configures transaction management around @Transactional components --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 


<!-- Resource loader for jdbc configuration --> 
<context:property-placeholder location="WEB-INF/jdbc.properties"/> 

<!-- Local Apache Commons DBCP DataSource that refers to a combined database --> 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
</bean> 

<!-- Transaction manager for a single JDBC DataSource --> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

<!-- SqlMap setup for iBATIS Database Layer --> 
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> 
    <property name="configLocation" value="WEB-INF/sql-map-config.xml"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

<!-- testing purpose --> 
<bean id="testDao" class="com.shop.cart.dao.ibatis.SqlMapTestDao"> 
    <property name="sqlMapClient" ref="sqlMapClient"/> 
</bean> 
+0

La classe avec l'annotation @Transactional est-elle connectée par Spring? Le ressort doit faire le câblage afin qu'il puisse installer des proxies. – Pace

+0

oui je fais. . suis-je dans la voie de droite pour annuler ma transaction? –

+0

Vous avez configuré le bean testDao dans Spring, mais obtenez-vous une instance testDao dans votre test de Spring? Pouvez-vous poster toute votre classe de test? – gdj

Répondre

5

Peut être la transaction ne fonctionne pas parce que votre table MySQL n'est pas InnoDB.

+0

non, j'utilise MyISAM. –

+2

+1 - MyISAM ne prend pas en charge les transactions; http://dev.mysql.com/doc/refman/5.1/en/myisam-storage-engine.html –

+0

merci zawhtut, vous avez raison. –

1

Avez-vous tous les éléments requis définis dans votre configuration Spring XML?

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

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <!-- (this dependency is defined somewhere else) --> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

De toute façon, vous devriez probablement poster votre configuration Spring XML ici pour une aide diagnostique supplémentaire. Voir Transaction Management pour plus d'informations.

+0

je le configure déjà. s'il vous plaît vérifier à nouveau à mon poste ci-dessus. Merci. –