2012-03-29 8 views
0

Ich versuche, die Spring @ transactional mit JDBC-Vorlagen von der Serviceebene Aufruf 2 Methoden in einem DAOImpl einfügen und mit Simplejdbctemplate zum Einfügen und ich sehe in den Protokollen, dass spring erzeugt eine neue Transaktion auf meiner Service-Methode und meine erste Einfügung ist erfolgreich, und die zweite Einfügung schlägt fehl, und obwohl sie sagt, dass sie auf der gleichen Verbindung zurückrollt, wird die erste Einfügung nie von meiner Mysql-Datenbank zurückgesetzt (ich verwende die innodb-Engine)).Spring @Transactional JDBC Vorlage MySQL DB nicht zurückrollen

Hier ist meine Service-Methode.

@Service 
@TransactionConfiguration(transactionManager="txManager") 
public class NewWizardService{ 
    ApplicationContext ctx = new ClassPathXmlApplicationContext("dataSourcesConfig.xml"); 
    UserDAO userDAO = (UserDAO)ctx.getBean("userDAO"); 
    @Transactional(rollbackFor=Throwable.class, readOnly=false) 
    public void createNewFirm() 
    { 

    userDAO.insert1(); 
    userDAO.insert2(); 

    } 

}

Hier ist meine Datenquelle und Transaktionsmanager Federkonfiguration.

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


<bean id="dbcpDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>${jdbc.driverClassName}</value></property> 
    <property name="url"><value>${jdbc.url}</value></property> 
    <property name="username"><value>${jdbc.username}</value></property> 
    <property name="password"><value>${jdbc.password}</value></property> 
</bean> 

<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/> 

Hier ist meine Protokollspur.

2012-03-28 16:56:31,460 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Creating new transaction with name [com.CAIS.wizardService.NewWizardServiceImpl.createNewFirm]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-java.lang.RuntimeException 
2012-03-28 16:56:31,654 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Acquired Connection [[email protected]] for JDBC transaction 
2012-03-28 16:56:31,660 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Switching JDBC Connection [[email protected]] to manual commit 
2012-03-28 16:56:31,663 DEBUG [org.springframework.jdbc.core.JdbcTemplate] - Executing prepared SQL update 
2012-03-28 16:56:31,663 DEBUG [org.springframework.jdbc.core.JdbcTemplate] - Executing prepared SQL statement [insert into client (fullName, createDate, createUser) values (?, ?, ?)] 
2012-03-28 16:56:31,663 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - Fetching JDBC Connection from DataSource 
2012-03-28 16:56:31,664 DEBUG [org.springframework.jdbc.datasource.DriverManagerDataSource] - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/cais] 
2012-03-28 16:56:31,816 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - Registering transaction synchronization for JDBC Connection 
2012-03-28 16:56:31,833 DEBUG [org.springframework.jdbc.core.JdbcTemplate] - SQL update affected 1 rows 
2012-03-28 16:56:31,840 DEBUG [org.springframework.jdbc.core.JdbcTemplate] - SQLWarning ignored: SQL state '01000', error code '1265', message [Data truncated for column 'createDate' at row 1] 
2012-03-28 16:56:31,842 DEBUG [org.springframework.jdbc.core.JdbcTemplate] - Executing prepared SQL update 
2012-03-28 16:56:31,842 DEBUG [org.springframework.jdbc.core.JdbcTemplate] - Executing prepared SQL statement [insert into client (fullName, createDate, createUser) values (?, ?, ?)] 
2012-03-28 16:56:31,918 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Finished creating instance of bean 'Sybase' 
2012-03-28 16:56:31,918 INFO [org.springframework.jdbc.support.SQLErrorCodesFactory] - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 
2012-03-28 16:56:31,918 DEBUG [org.springframework.jdbc.support.SQLErrorCodesFactory] - Looking up default SQLErrorCodes for DataSource [[email protected]4b0a] 
2012-03-28 16:56:31,920 DEBUG [org.springframework.jdbc.support.SQLErrorCodesFactory] - Database product name cached for DataSource [[email protected]4b0a]: name is 'MySQL' 
2012-03-28 16:56:31,920 DEBUG [org.springframework.jdbc.support.SQLErrorCodesFactory] - SQL error codes for 'MySQL' found 
2012-03-28 16:56:31,920 DEBUG [org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator] - Unable to translate SQLException with Error code '1406', will now try the fallback translator 
2012-03-28 16:56:31,920 DEBUG [org.springframework.jdbc.support.SQLStateSQLExceptionTranslator] - Extracted SQL state class '22' from value '22001' 
2012-03-28 16:56:31,921 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - Returning JDBC Connection to DataSource 
2012-03-28 16:56:31,923 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Initiating transaction rollback 
2012-03-28 16:56:31,923 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Rolling back JDBC transaction on Connection [[email protected]] 
2012-03-28 16:56:31,934 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Releasing JDBC Connection [[email protected]] after transaction 
2012-03-28 16:56:31,934 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - Returning JDBC Connection to DataSource 

Vielen Dank im Voraus.

Antwort

0

Verwenden Sie @Transactional anstelle von @TransactionConfiguration, weil es für Transaktionstests verwendet wird. @Transactional ist für einen einzelnen txManager in Ordnung, aber wenn Sie mehrere haben, können Sie Ihren tx anno ändern. wie @Transactional ("productTxManager") oder @Transactional ("orderTxManager").

0

Ihre <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/> muss in Ihrer webapp-serlet.xml definiert werden.

Hier finden Sie eine Erläuterung: Spring @Transactional annotations ignored