【发布时间】:2015-04-07 07:09:53
【问题描述】:
我正在尝试使用 Spring Transactions,但失败了。当我设置它们以便我的网络应用程序将在 Tomcat 下启动时,调用
TransactionAspectSupport.currentTransactionStatus ().setRollbackOnly ();
当我需要回滚事务,但之前的数据库更改未回滚时,我的 localhost.date.log 文件中出现以下错误:
SEVERE: Servlet.service() for servlet model threw exception
org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
at org.springframework.transaction.interceptor.TransactionAspectSupport.currentTransactionStatus(TransactionAspectSupport.java:122)
at edu.mayo.bsi.backslapper.model.dao.impl.TransactServiceDAOImpl.giveProps(TransactServiceDAOImpl.java:160)
我有
public interface TransactServiceDAO
和
public class TransactServiceDAOImpl implements TransactServiceDAO
在我的 application-context-config.xml 我有
<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>
这是一个示例,一个 (count == 0) 回滚不会撤消“删除旧用户”的例程。
我做错了什么?
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;
}
【问题讨论】:
标签: java spring transactions spring-transactions