I am trying to use Spring Transactions, and failing. When I set them up so that my web app will launch under Tomcat, calling
TransactionAspectSupport.currentTransactionStatus ().setRollbackOnly ();
when I need to roll back a transaction, but the previous DB changes are not rolled back I have
public interface TransactServiceDAO
and
public class TransactServiceDAOImpl implements TransactServiceDAO
in my application-context-config.xml I have
<bean id = "transactService" class = "edu.mayo.bsi.backslapper.model.dao.impl.TransactServiceDAOImpl"/>
<!-- enable the configuration of transactional behavior based on annotations -->
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
<tx:advice id = "txAdvice" transaction-manager = "txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name = "get*" read-only = "true"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name = "*"/>
</tx:attributes>
</tx:advice>
<!-- ensure that the above transactional advice runs for any execution of an operation defined by the TransactServiceDAO interface -->
<aop:config>
<aop:pointcut id = "transactServiceOperation" expression = "execution(* edu.mayo.bsi.backslapper.model.dao.TransactServiceDAO.*(..))"/>
<aop:advisor advice-ref = "txAdvice" pointcut-ref = "transactServiceOperation"/>
</aop:config>
<bean id = "txManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name = "dataSource" ref = "backDataSource"/>
</bean>
<tx:advice id = "txAdvice" transaction-manager = "txManager">
<tx:attributes>
<tx:method name = "*" rollback-for = "Throwable"/>
<tx:method name = "*" rollback-for = "java.sql.SQLException"/>
</tx:attributes>
</tx:advice>
Here's an example, a routine where a (count == 0) rollback does not undo the "delete old users".
What am I doing wrong?
public String setUsers (DataSource dataSource, User theUser, String store, AdminUser[] newUsers)
{
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate (dataSource);
Map<String, Object> params = new HashMap<String, Object> ();
params.put ("lanID", theUser.getLanID ());
params.put ("storeName", store);
int count = namedParameterJdbcTemplate.update (kDeleteOldUsers, params);
for (AdminUser curUser : newUsers)
{
int userID = updateUser (namedParameterJdbcTemplate, curUser.getLanID (), curUser.getFullName (), curUser.getEmail (), null);
if (userID == kError)
userID = addUser (namedParameterJdbcTemplate, curUser);
params.put ("userID", Integer.valueOf (userID));
count = namedParameterJdbcTemplate.update (kAddStoreUser, params);
if (count == 0) // Wasn't inserted
TransactionAspectSupport.currentTransactionStatus ().setRollbackOnly ();
params.put ("backslapsToGive", Integer.valueOf (curUser.getBackslapsToGive ()));
params.put ("monthlyBackslaps", Integer.valueOf (curUser.getMaxBackslaps ()));
count = namedParameterJdbcTemplate.update (kUpdateUserStores, params);
if (count == 0) // Wasn't updated
TransactionAspectSupport.currentTransactionStatus ().setRollbackOnly ();
}
return null;
}
Thank you, Greg
Aucun commentaire:
Enregistrer un commentaire