Java 使用SpringJDBCTemplate跨多个DAO协调事务

Java 使用SpringJDBCTemplate跨多个DAO协调事务,java,spring,transactions,Java,Spring,Transactions,我有一个包含服务层的体系结构,其中每个服务类可以注入一个或多个dao类 我了解如何在DAO中创建和执行扩展JDBCDAO支持的事务。但是,我希望在服务层中对事务进行更高级别的控制,并使事务跨越多个DAO的多个调用 public class JdbcUserAccountDao extends JdbcDaoSupport implements UserAccountDao { private TransactionTemplate transactionTemplate; pu

我有一个包含服务层的体系结构,其中每个服务类可以注入一个或多个dao类

我了解如何在DAO中创建和执行扩展JDBCDAO支持的事务。但是,我希望在服务层中对事务进行更高级别的控制,并使事务跨越多个DAO的多个调用

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上下文片段:

<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>
服务层bean自然地注入了两个DAO

<bean id="userService" class="com.xxx.api.service.impl.UserServiceImpl">
    <property name="userAccountDao" ref="userAccountDao"/>
    <property name="someOtherDao" ref="someOtherDao"/>
</bean>


我希望在我的服务层中启动和结束事务,并跨越对不同DAO的调用。这可能吗?谢谢您的帮助。

如果我很好地理解了您的问题,那么我会将事务隔离传播设置为propagation.REQUIRED

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

我希望这有帮助

安杰洛

<bean id="userService" class="com.xxx.api.service.impl.UserServiceImpl">
    <property name="userAccountDao" ref="userAccountDao"/>
    <property name="someOtherDao" ref="someOtherDao"/>
</bean>
@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;
    }
}