Spring @Transactional JDBC Template MySQL DB не откатывается - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь реализовать Spring @transactional с помощью шаблонов jdbc из сервисного уровня, вызывая 2 вставьте методы в DAOImpl и используя simplejdbctemplate для вставки, и я вижу в журналах, что пружина создает новую транзакцию для моего метода обслуживания, и моя первая вставка завершается успешно, а вторая вставка завершается неудачно, и даже при том, что она говорит, что она откатывается на тот же метод соединение, первая вставка никогда не откатывается из моей базы данных MySQL (я использую движок innodb).

Вот мой метод обслуживания.

@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();

    }

}

Вот моя весенняя конфигурация источника данных и менеджера транзакций.

<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"/>

Вот мой след журнала.

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 [org.apache.commons.dbcp.PoolableConnection@7d627b8b] for JDBC transaction
2012-03-28 16:56:31,660 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Switching JDBC Connection [org.apache.commons.dbcp.PoolableConnection@7d627b8b] 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 [org.springframework.jdbc.datasource.DriverManagerDataSource@6cf84b0a]
2012-03-28 16:56:31,920 DEBUG [org.springframework.jdbc.support.SQLErrorCodesFactory] - Database product name cached for DataSource [org.springframework.jdbc.datasource.DriverManagerDataSource@6cf84b0a]: 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 [org.apache.commons.dbcp.PoolableConnection@7d627b8b]
2012-03-28 16:56:31,934 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - Releasing JDBC Connection [org.apache.commons.dbcp.PoolableConnection@7d627b8b] after transaction
2012-03-28 16:56:31,934 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - Returning JDBC Connection to DataSource

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 мая 2012

Ваш <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/> должен быть определен в вашем webapp-serlet.xml.

Вы найдете объяснение здесь: Spring @Transactional аннотации игнорируются

0 голосов
/ 04 мая 2012

используйте @Transactional вместо @TransactionConfiguration, потому что это для транзакционных тестов. @Transactional подходит для одного txManager, но если у вас их больше, вы можете изменить свой tx anno. например, @Transactional ("productTxManager") или @Transactional ("orderTxManager").

...