I'm writing a bulk update function for my application, but have encountered some transaction problems.
First, I have defined a BatchDAO for the data access, snippet
And then, I defined a service to make use of the BatchDAO, snippet ...Code:public BatchDAOJdbc extends JdbcDAOSupport implements BatchDAO { public int batchUpdate(String str) { return getJdbcTemplate().update(str); } }
and the applicationContext.xml ...Code:public BatchUpdateManagerImpl extends BaseManagerImpl implements BatchUpdateManager { BatchDAO dao; public void setBatchDAO(BatchDAO dao) { this.dao = dao; } public int batchUpdateCommitOnError(String str) { return dao.batchUpdate(str); } public int batchUpdateRollbackOnError(String str) { return dao.batchUpdate(str); } public int batchUpdateSimulate(String str) { return dao.batchUpdate(str); } }
batchUpdateSimulate is intended to simulate running SQL once but will not commit any changeCode:<beans> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:database.properties</value> </list> </property> </bean> <bean id="dataSource" 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> <bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"><ref bean="dataSource"/></property> </bean> <bean id="jdbcTxProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="jdbcTransactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean id="batchUpdateManager" parent="jdbcTxProxyTemplate"> <property name="target"> <bean class="my.service.BatchUpdateManagerImpl"> <property name="batchDAO"><ref bean="batchDAO"/></property> </bean> </property> <!-- Override default transaction attributes --> <property name="transactionAttributes"> <props> <prop key="batchUpdateSimulate*">PROPAGATION_NEVER</prop> <prop key="batchUpdateCommitOnError*">PROPAGATION_REQUIRED</prop> <prop key="batchUpdateRollbackOnError*">PROPAGATION_REQUIRED,-Exception</prop> </props> </property> </bean> <bean id="batchDAO" class="my.BatchDAOJdbc"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean> </beans>
batchUpdateCommitOnError runs the SQL and commit the previous change if there is any ongoing error
batchUpdateRollbackOnError run the SQL and rollback if there is any ongoing error
First Question ..
I would like to know can I use to PROPOGATION_NEVER to acomplish the simulate function , if not , how could I do this ??
Second Question ..
I can't achieve the commit on error function.Suppose there are 10 SQL to run, and middle part of SQL is invalid. I expect that the first running SQL can be commit, but it was not. Is there any problem in my applicationContext.xml ??
I'm apperciate to get some advices here , many thanks !


Reply With Quote