【问题标题】:Coordinating transactions across multiple Daos using Spring JdbcTemplate使用 Spring JdbcTemplate 跨多个 Daos 协调事务
【发布时间】: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


    【解决方案1】:

    如果我理解你的问题,那么我会将事务隔离传播设置为 Propagation.REQUIRED。

    例如,在我的服务中我写了(但注意我使用了注释):

    @Transactional(propagation=Propagation.REQUIRED)
    public void save(T t) throws Exception {
        try {
    
            dao.save(t);
        } catch (Exception e) {
    
            logger.fatal("Errore nel salvataggio dell'entità di tipo "
                    + t.getClass().getName(), e);
            throw e;
        }
    }
    

    希望对你有帮助

    安杰洛

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多