2012-03-29 109 views
0

我試圖用服務層中的jdbc模板實現Spring @transactional,調用 2在DAOImpl中插入方法並使用simplejdbctemplate插入,並在日誌中看到spring會在我的服務方法上創建一個新事務,並且我的第一個插入操作會成功,第二個插入操作會失敗,即使它表示它在同一個連接上回滾,第一個插入操作也不會從我的Mysql數據庫回滾(我正在使用innodb引擎)。spring @Transactional JDBC模板MySQL數據庫不回滾

這是我的服務方法。

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

    } 

}

這是我的數據源和事務管理Spring配置。

<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 [[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 

在此先感謝。

回答

0

使用@Transactional而不是@TransactionConfiguration,因爲它用於事務測試。 @Transactional適用於單個txManager,但如果您擁有多個txManager,則可以更改tx anno。像@Transactional(「productTxManager」)或@Transactional(「orderTxManager」)。

0

您的<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>需要在您的webapp-serlet.xml中定義。

你會在這裏找到一個解釋:Spring @Transactional annotations ignored