【发布时间】:2014-05-07 15:51:39
【问题描述】:
我有一个包含服务层的架构,其中每个服务类都可以注入一个或多个 dao 类。
我了解如何在扩展 JdbcDaoSupport 的 daos 中创建和执行事务。但是,我希望对服务层中的事务进行更高级别的控制,并让事务跨越多个 daos 的多个调用。
public class JdbcUserAccountDao extends JdbcDaoSupport implements UserAccountDao {
private TransactionTemplate transactionTemplate;
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
@Override
public void changeUserDetails(final String someString) throws Exception {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
getJdbcTemplate().update(some table);
getJdbcTemplate().update(some other table);
}
catch (Exception ex) {
status.setRollbackOnly();
throw new RuntimeException(ex);
}
}
});
}
Spring上下文sn-p:
<bean id="userAccountDao" class="com.xxx.api.dao.jdbc.JdbcUserAccountDao">
<property name="dataSource" ref="dataSource"/>
<property name="transactionTemplate" ref="txTemplate"/>
</bean>
<bean id="txTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
层次结构的上一层,服务类:
public class UserServiceImpl implements UserService {
private UserAccountDao userAccountDao;
private SomeOtherDao someOtherDao;
public void setUserAccountDao(UserAccountDao userAccountDao) {
this.userAccountDao = userAccountDao;
}
public void setSomeOtherDao (SomeOtherDao someOtherDao ) {
this.someOtherDao = someOtherDao ;
}
public void changeUserAndSomeOtherStuff(String details) {
// Would like transaction to start here ...
userAccountDao.changeUserDetails(details);
someOtherDao.changeSomethingElse(details);
// ... and end here.
}
}
服务层 bean 很自然地被注入了这两个 Daos。
<bean id="userService" class="com.xxx.api.service.impl.UserServiceImpl">
<property name="userAccountDao" ref="userAccountDao"/>
<property name="someOtherDao" ref="someOtherDao"/>
</bean>
我想在我的服务层开始和结束事务,并跨越对不同 Daos 的调用。这可能吗?感谢您的帮助。
【问题讨论】:
标签: java spring transactions